/********************************************************************
 * カレンダーによる日付入力スクリプト
 *
 * ( 下記スクリプトは改造も可能ですがまったくいじらずにそのままペース
 *   トするだけでもご利用いただけるように書いてあります )
 *
 *  Syntax : wrtCalendar( formElementObject[,moveMonthFlg][,winOpenFlg] )
 *  例     : wrtCalendar( this )
 *
 *  使いたいINPUT入力タグにonFocus="wrtCalendar(this)"を ペーストし
 *  ます。それぞれのタグに違う名前(NAME属性)を忘れずに付けておいてく
 *  ださい。
 *
 *  Example :受付日:<INPUT NAME=e1 TYPE=text
 *                         onFocus="wrtCalendar(this)">
 *
 * ------------------------------------------------------------------
 * calendar.js Copyright(c)1999 Toshirou Takahashi tato@fureai.or.jp
 * Support http://www.fureai.or.jp/~tato/JS/BOOK/INDEX.HTM
 * ------------------------------------------------------------------
 */

var now    = new Date()
var absnow = now
var Win=navigator.userAgent.indexOf('Win')!=-1
var Mac=navigator.userAgent.indexOf('Mac')!=-1
var X11=navigator.userAgent.indexOf('X11')!=-1
var Moz=navigator.userAgent.indexOf('Gecko')!=-1
var Opera=!!window.opera
var winflg=1

function wrtCalendar(oj,arg1,arg2){

  if(Opera)return
  oj.blur()

  if(!arguments[1])arg1=0
  if(!Moz)
  if(arguments[1]||arguments[1]==0)winflg=0


  //-初期化
  if(arg1==0)now = new Date()

  //-年月日取得
  nowdate  = now.getDate()
  nowmonth = now.getMonth()
  nowyear  = now.getYear()

  //-月移動処理
  if(nowmonth==11 && arg1 > 0){        //12月でarg1が+なら
    nowmonth = -1 + arg1 ; nowyear++   //月はarg1-1;1年加算
  } else if(nowmonth==0 && arg1 < 0){  //1月でarg1が-なら
    nowmonth = 12 + arg1 ; nowyear--   //月はarg1+12;1年減算
  } else {
    nowmonth +=  arg1                  //2-11月なら月は+arg1
  }

  //-2000年問題対応
  if(nowyear<1900)nowyear=1900+nowyear

  //-現在月を確定
  now   = new Date(nowyear,nowmonth,1)

  //-YYYYMM作成
  nowyyyymm=nowyear*100+nowmonth

  //-YYYY/MM作成
  nowtitleyyyymm=nowyear+'-'+(nowmonth + 1)

  //-週設定
  week = new Array('日','月','火','水','木','金','土');

  //-カレンダー表示用サブウインドウオープン
  if(winflg){

    var w=152
    var h=156

    //-calendar用OS別サイズ微調整
    if(Moz)     { w+=15 ; h+=40 }
    else if(Win){ w+=0  ; h+=0  }
    else if(Mac){ w+=8  ; h+=22 }
    else if(X11){ w+=5  ; h+=46 }

    var x=100
    var y=20

    if(document.all){

        x=window.event.screenX+30
        y=window.event.screenY-180

    } else if (document.layers || document.getElementById){

        x+=window.screenX
        y+=window.screenY
    }

    mkSubWin('','calendar',x,y,w,h)

  }

  //-カレンダー構築用基準日の取得
  fstday   = now                                           //今月の1日
  startday = fstday - ( fstday.getDay() * 1000*60*60*24 )  //最初の日曜日
  startday = new Date(startday)

  //-カレンダー構築用HTML
  ddata = ''
  ddata += '<HTML>\n'
  ddata += '<HEAD>'
  if(!Moz)
  ddata += '<meta http-equiv="Content-Type" content="text/html;charset=SHIFT_JIS">\n'
  ddata += '<TITLE>Auto Input Calendar</TITLE>\n'
  ddata += '<STYLE>\n'
  ddata += ' BODY  { font:12px ; line-height:12px ; margin : 7px }\n'
  ddata += ' TH  { font:12px ; line-height:12px ; font-weight : 900 }\n'
  ddata += ' TD  { font:12px ; font-family : Arial; line-height:12px }\n'

  ddata += ' A  { text-decoration:none;color:#000000;font:10px;font-family:Arial;line-height:12px }\n'
  ddata += ' INPUT  { font:10px ; font-family : Arial ; line-height:10px ; padding:0px}\n'
  ddata += '</STYLE>\n'
  ddata += '</HEAD>\n'
  ddata += '<BODY  BGCOLOR=#dddddd>\n'

  ddata += '<FORM>\n'
  ddata += '<TABLE BORDER=0 BGCOLOR=#dddddd  BORDERCOLOR=#dddddd WIDTH=140 HEIGHT=140>\n'

  //-MONTH
  ddata += '   <TR id="trmonth" BGCOLOR=orange BORDERCOLOR=orange WIDTH=140 HEIGHT=14>\n'
  ddata += '   <TH COLSPAN=7 WIDTH=140 HEIGHT=14 ALIGN="right"><NOBR>\n'

  ddata +=       nowtitleyyyymm
  ddata += ' <INPUT TYPE=button VALUE="<<" '
  ddata += '  onClick="self.opener.wrtCalendar(self.opener.document.'
  ddata +=            oj.form.name+'.'+oj.name+',-1,0)">\n'
  ddata += '<INPUT TYPE=button VALUE="o" '
  ddata += '  onClick="self.opener.wrtCalendar(self.opener.document.'
  ddata +=            oj.form.name+'.'+oj.name+',0,0)">\n'
  ddata += '<INPUT TYPE=button VALUE=">>" '
  ddata += '  onClick="self.opener.wrtCalendar(self.opener.document.'
  ddata +=            oj.form.name+'.'+oj.name+',1,0)">\n'
  ddata += '</NOBR></TH>\n'
  ddata += '   </TR>\n'

  //-WEEK
  ddata += '   <TR BGCOLOR=pink WIDTH=140 HEIGHT=14>\n'

  for (i=0;i<7;i++){
    ddata += '   <TH WIDTH=14 HEIGHT=14>\n'
    ddata +=       week[i]
    ddata += '   </TH>\n'
  }
  ddata += '   </TR>\n'

  //-DATE
  for(j=0;j<6;j++){
    ddata += '   <TR BGCOLOR=#ffffff>\n'
    for(i=0;i<7;i++){
      nextday = startday.getTime() + (i * 1000*60*60*24)
      wrtday  = new Date(nextday)

      wrtdate = wrtday.getDate()
      wrtmonth= wrtday.getMonth()
      wrtyear = wrtday.getYear()
      if(wrtyear < 1900)wrtyear=1900 + wrtyear
      wrtyyyymm = wrtyear * 100 + wrtmonth
      //wrtyyyymmdd= ''+wrtyear +'-'+ (wrtmonth+1) +'-'+wrtdate
      wrtyyyymmdd= ''+ sprintf("%04d-%02d-%02d", wrtyear,(wrtmonth+1), wrtdate)

      wrtdateA  = '<A HREF="javascript:function v(){'
      wrtdateA += '   self.opener.document.'+oj.form.name
      wrtdateA += '.'+oj.name+'.value=(\''+wrtyyyymmdd+'\');self.close()};v()" '
      wrtdateA += '>\n'
      wrtdateA += '<FONT COLOR=#000000>\n'
      wrtdateA += wrtdate
      wrtdateA += '</FONT>\n'
      wrtdateA += '</A>\n'

      if(wrtyyyymm != nowyyyymm){ 
        ddata += ' <TD BGCOLOR=#cccccc WIDTH=14 HEIGHT=14>\n'
        ddata += wrtdateA

      } else if( wrtdate  == absnow.getDate()  && 
                 wrtmonth == absnow.getMonth() && 
                 wrtday.getYear() == absnow.getYear()){
        ddata += ' <TD BGCOLOR=magenta WIDTH=14 HEIGHT=14>\n'
        ddata += '<FONT COLOR="#ffffff">'+wrtdateA+'</FONT>\n'

      } else {
        ddata += ' <TD WIDTH=14 HEIGHT=14>\n'
        ddata += wrtdateA
      }
      ddata += '   </TD>\n'
    }
    ddata += '   </TR>\n'

    startday = new Date(nextday)
    startday = startday.getTime() + (1000*60*60*24)
    startday = new Date(startday)
  }

  //-mac用クローズボタン
  if(Mac){
    ddata += '   <TR>\n'
      ddata += '   <TD COLSPAN=7 ALIGN=center>\n'
       ddata += '   <INPUT TYPE=button VALUE="CLOSE" '
       ddata += '          onClick="self.close();return false">\n'
      ddata += '   </TD>\n'
    ddata += '   </TR>\n'
  }

  ddata += '</TABLE>\n'

  ddata += '</FORM>\n'

  ddata += '</BODY>\n'
  ddata += '</HTML>\n'

  calendarwin.document.write(ddata)
  calendarwin.document.close()
  calendarwin.focus()

  winflg=1
}


/********************************************************************
 * 簡易サブウインドウ開き
 *  Syntax : mkSubWin(URL,winName,x,y,w,h)
 *  例     : mkSubWin(winIndex,'test.htm','win0',100,200,150,300)
 * ------------------------------------------------------------------
 */

var calendarwin;

function mkSubWin(URL,winName,x,y,w,h){

    var para =""
             +" left="        +x
             +",screenX="     +x
             +",top="         +y
             +",screenY="     +y
             +",toolbar="     +0
             +",location="    +0
             +",directories=" +0
             +",status="      +0
             +",menubar="     +0
             +",scrollbars="  +0
             +",resizable="   +1
             +",innerWidth="  +w
             +",innerHeight=" +h
             +",width="       +w
             +",height="      +h

        calendarwin=window.open(URL,winName,para);
        calendarwin.focus()

}
  /*--/////////////ここまで///////////////////////////////////////--*/


//************************************************************
// sprintf.js
//	2004/03/31
//	MW web studio http://homepage1.nifty.com/aok2/
//	aoki makoto <gzl03577@nifty.ne.jp>
//
//	string sprintf ( string i_format [, mixed i_arg1, mixed i_arg2, ...] )
//	string vsprintf( string i_format, array i_args )
//  string hex( number i_num )
//  string oct( number i_num )
//  string bin( number i_num )
//
//	%b		２進数表示
//	%c		与えられた数値をアスキーコードとして１文字表示
//	%d		１０進数表示
//	%e %E	浮動小数点 指数形式 1.234567e+012
//	%f 		浮動小数点 展開形式 123456700000.000000
//	%g %G	%e または %f の自動選択
//	%o		８進数表示
//	%s		文字列表示
//	%x	%X	16進数表示
//
//	使い方例					戻り値
//	sprintf("%08b",   0x34 )	"00110100"
//	sprintf("%c",     0x41 )	"A"
//	sprintf("%+03d",  3    )	"+03"
//	sprintf("%12.3E", 0.345)	"  3.450E-001"
//	sprintf("%12.3f", 0.345)	"       0.345"
//	sprintf("%-9o",   255  )	"377      "
//	sprintf("%-9s",   "ABC")	"ABC      "
//	sprintf("%9s",    "ABC")	"      ABC"
//	sprintf("%04x",   255  )	"00ff"
//	sprintf("%04X",   255  )	"00FF"
//
//	%u       未サポート
//	#        未サポート
//	桁指定 * 未サポート
//	引数交換 未サポート
//************************************************************

//============================================================
//	string sprintf ( string i_format [, mixed i_arg1, mixed i_arg2, ...] )
//============================================================
function sprintf( i_format )
{
	var args = new Array();
	
	for ( var i = 1; i < sprintf.arguments.length; ++i )
	{
		args[ args.length ] = sprintf.arguments[i];
	}
	return vsprintf( i_format, args );
}

//============================================================
//	string vsprintf ( string i_format, array i_args )
//============================================================
function vsprintf( i_format, i_args )
{
	var src = i_format;
	var	dst = "";
	var left_part, match_part, right_part;
	var flags, width, precision, type;
	
	for( var i = 0; 0 <= src.search(/%([#0 \-\+]*)([1-9]*[0-9]*)([\.][0-9]*|)([%bcdeEfgGoxXs]{1})/);  )
	{
		left_part  = RegExp.leftContext;
		right_part = RegExp.rightContext;
		flags      = RegExp.$1 + '';
		width      = RegExp.$2 + '';
		precision  = RegExp.$3 + '';
		type       = RegExp.$4 + '';

		if ( type == '%' )
		{
			match_part = '%';
		}
		else if( i < i_args.length )
		{
			match_part = _sprintf(flags, width, precision, type, i_args[i]);
			++i;
		}
		else
		{
			match_part = '';
		}
		
		dst += (left_part + match_part);
		src = right_part;
	}
	dst += src;

	return dst;
}

//------------------------------------------------------------
// local function
//------------------------------------------------------------
function _sprintf( i_flags, i_width, i_precision, i_type, i_value )
{
	switch( i_type )
	{
	case 'b':	func = _sprintf_b; break;
	case 'c':	func = _sprintf_c; break;
	case 'd':	func = _sprintf_d; break;

	case 'e':
	case 'E':
	case 'f':
	case 'g':
	case 'G':	func = _sprintf_f; break;
	
	case 'o':	func = _sprintf_o; break;
	case 's':	func = _sprintf_s; break;

	case 'x':
	case 'X':	func = _sprintf_x; break;
	
	default:	return '';
	}

	return func( i_flags, i_width, i_precision, i_type, i_value );
}

//------------------------------------------------------------
// local function
//------------------------------------------------------------
function _sprintf_b( i_flags, i_width, i_precision, i_type, i_value )
{
	// -	左詰
	// 0	i_precision省略時、左詰め文字
	var align;
	var left_pad_char;		// case align=right
	var right_pad_char;		// case align=left
	var pad_len;
	var s;
	
	s = bin( Math.floor(i_value) );

	align          = (0 <= i_flags.search(/\-/)) ? 'left' : 'right';
	left_pad_char  = (0 <= i_flags.search(/0/) && i_precision == '') ? '0' : ' ';
	right_pad_char = ' ';

	if ( i_precision != '' )
	{
		s = (s == '0') ? '' : s;
		
		pad_len = Number(i_precision.substr(1)) - s.length;
		if ( 0 < pad_len )
		{
			s = str_repeat('0', pad_len) + s;
		}
	}

	if( i_width != '' )
	{
		pad_len = Number(i_width) - s.length;
		if( 0 < pad_len )
		{
			if ( align == 'left' )
			{
				s = s + str_repeat(right_pad_char, pad_len);
			}
			else
			{
				s = str_repeat(left_pad_char, pad_len) + s;
			}
		}
	}

	return s;
}

//------------------------------------------------------------
// local function
//------------------------------------------------------------
function _sprintf_c( i_flags, i_width, i_precision, i_type, i_value )
{
	var align;
	var pad_len;
	var right_pad_char;
	var left_pad_char;
	var s;

	s = '';
	s = String.fromCharCode( Number(i_value) );

	align          = (0 <= i_flags.search(/\-/)) ? 'left' : 'right';
	left_pad_char  = (0 <= i_flags.search(/0/) ) ? '0' : ' ';
	right_pad_char = ' ';

	if( i_width != '' )
	{
		pad_len = Number(i_width) - strlen_b(s);
		if( 0 < pad_len )
		{
			if ( align == 'left' )
			{
				s = s + str_repeat(right_pad_char, pad_len);
			}
			else
			{
				s = str_repeat(left_pad_char, pad_len) + s;
			}
		}
	}

	return s;
}

//------------------------------------------------------------
// local function
//------------------------------------------------------------
function _sprintf_d( i_flags, i_width, i_precision, i_type, i_value )
{
	var align;
	var left_pad_char;		// case align=right
	var right_pad_char;		// case align=left
	var pad_len;
	var sign;
	var s;

	s = String(Math.floor(Math.abs( i_value )));

	align          = (0 <= i_flags.search(/\-/)) ? 'left' : 'right';
	left_pad_char  = (0 <= i_flags.search(/0/) && i_precision == '') ? '0' : ' ';
	right_pad_char = ' ';

	if ( i_precision != '' )
	{
		s = (s == '0') ? '' : s;
		
		pad_len = Number(i_precision.substr(1)) - s.length;
		if ( 0 < pad_len )
		{
			s = str_repeat('0', pad_len) + s;
		}
	}

	if( i_flags.search(/\+/) >= 0 )
	{
		sign = ( i_value >= 0 ) ? '+' : '-';
	}
	else if( i_flags.search(/ /) >= 0 )
	{
		sign = ( i_value >= 0 ) ? ' ' : '-';
	}
	else
	{
		sign = ( i_value >= 0 ) ? '' : '-';
	}

	if( i_width != '' )
	{
		pad_len = Number(i_width) - sign.length - s.length;
		if( 0 < pad_len )
		{
			if ( align == 'left' )
			{
				s = sign + s + str_repeat(right_pad_char, pad_len);
			}
			else if ( left_pad_char == '0' )
			{
				// "+0000123"
				s = sign + str_repeat(left_pad_char, pad_len) + s;
			}
			else
			{
				// "    +123"
				s = str_repeat(left_pad_char, pad_len) + sign + s;
			}
		}
		else
		{
			s = sign + s;
		}
	}
	else
	{
		s = sign + s;
	}
	
	return s;
}

//------------------------------------------------------------
// local function
//------------------------------------------------------------
function _sprintf_f( i_flags, i_width, i_precision, i_type, i_value )
{
	var precision;
	var s = '';
	var num_l, num_r, num_e;
	var sign
	var point;

	precision = (i_precision == '') ? 6 : Number(i_precision.substr(1));

	var arr = __float( i_value, i_type );
	num_l = arr[0];
	num_r = arr[1];
	num_e = arr[2];

	if ( num_r.length <= precision )
	{
		num_r += str_repeat('0', precision);
		num_r = num_r.substr(0, precision);
	}
	else
	{
		var n = num_r.length - precision;
		num_r = parseFloat( num_r );
		for ( ; 0 < n; --n )
		{
			num_r /= 10.0;
		}
		num_r = Math.round( num_r );
		num_r = String( num_r );
		num_r = str_repeat('0', precision) + num_r;
		num_r = num_r.substr( num_r.length - precision );
	}

	     if( i_flags.search(/\+/) >= 0 ){ sign = ( i_value >= 0 ) ? '+' : '-';	}
	else if( i_flags.search(/ / ) >= 0 ){ sign = ( i_value >= 0 ) ? ' ' : '-';	}
	else	                            { sign = ( i_value >= 0 ) ? ''  : '-';	}

	     if( i_flags.search(/#/) >= 0            ) { point = '.'; }
	else if( precision == 0 || num_r.length == 0 ) { point = '';  }
	else                                           { point = '.'; }

	if ( num_e != '' )
	{
		switch ( i_type )
		{
		case 'e':
		case 'g':
			num_e = 'e' + num_e;
			break;
		
		case 'E':
		case 'G':
			num_e = 'E' + num_e;
			break;
		}
	}
	
	var s = num_l + point + num_r + num_e;

	if ( i_width != '' )
	{
		var pad_len = Number(i_width) - (sign.length + s.length);
		if( 0 < pad_len )
		{
			if( i_flags.search(/\-/) >= 0 )
			{
				s = sign + s + str_repeat(' ', pad_len);
			}
			else
			{
				if( i_flags.search(/0/) >= 0 )
				{
					s = sign + str_repeat('0', pad_len) + s;
				}
				else
				{
					s = str_repeat(' ', pad_len) + sign + s;
				}
			}
		}
		else
		{
			s = sign + s;
		}
	}
	else
	{
		s = sign + s;
	}

	return s;
}

function __float( i_value, i_type )
{
	var num_l, num_r, num_e;

	(i_value.toString()).search( /([+\-]*)([0-9]*)([\.]*)([0-9]*)([Ee]*)([+\-]*[0-9]*)/ );
	num_l = RegExp.$2;
	num_r = RegExp.$4;
	num_e = RegExp.$6;

	switch ( i_type )
	{
	case 'g':
	case 'G':
		if ( num_e != '' )
		{
			num_e = sprintf("%+04d", num_e);
		}
		break;
		
	case 'e':
	case 'E':
		if ( num_e == '' )
		{
			num_e = 0;
			if ( 1 < num_l.length )
			{
				// 12345.67    --> 1.234567 e+04
				num_e = num_l.length - 1;
				num_r = num_l.substr(1) + num_r;
				num_l = num_l.substr(0,1);
			}
			else if ( num_l.length == 1 && num_l != '0' )
			{
				// 1.????
				// do nothing
			}
			else 
			{
				//  .00001234  ---> 1.234   e-05
				// 0.00123455  ---> 1.23455 e-03
				var n = num_r.search( /([1-9][0-9]*)$/ );
				if ( 0 <= n )
				{
					num_l = num_r.substr( n, 1 );
					num_r = num_r.substr( n + 1 );
					num_e = -(n + 1);
				}
			}
		}
		else
		{
			num_e = Number(num_e);
		}
		num_e = sprintf("%+04d", num_e);
		break;
		
	case 'f':
		if ( num_e != '' )
		{
			num_e = Number(num_e);
			if ( 0 < num_e )
			{
				if ( num_e <= num_r.length )
				{
					num_l += num_r.substr(0, num_e);
					num_r =  num_r.substr(num_e);
				}
				else
				{
					num_l += num_r;
					num_e -= num_r.length;
					num_r = "";
					num_l += str_repeat('0', num_e);
				}
			}
			else if ( num_e < 0 )
			{
				num_e = Math.abs(num_e);
				if ( num_e <= num_l.length )
				{
					num_r = num_l.substr(num_l.length - num_e) + num_r;
					num_l = num_l.substr(0, num_l.length - num_e);
				}
				else
				{
					num_r =  num_l + num_r;
					num_e -= num_l.length;
					num_l = "";
					num_r = str_repeat('0', num_e) + num_r;
				}
				if ( num_l == '' )
				{
					num_l = '0';
				}
			}
			num_e = '';
		}
		break;
		
	default:
		break;
	}
	
	return  new Array( num_l, num_r, num_e );
}

//------------------------------------------------------------
// local function
//------------------------------------------------------------
function _sprintf_o( i_flags, i_width, i_precision, i_type, i_value )
{
	// -	左詰
	// 0	i_precision省略時、左詰め文字
	var align;
	var left_pad_char;		// case align=right
	var right_pad_char;		// case align=left
	var pad_len;
	var s;
	
	s = oct( Math.floor(i_value) );

	align          = (0 <= i_flags.search(/\-/)) ? 'left' : 'right';
	left_pad_char  = (0 <= i_flags.search(/0/) && i_precision == '') ? '0' : ' ';
	right_pad_char = ' ';

	if ( i_precision != '' )
	{
		s = (s == '0') ? '' : s;
		
		pad_len = Number(i_precision.substr(1)) - s.length;
		if ( 0 < pad_len )
		{
			s = str_repeat('0', pad_len) + s;
		}
	}

	if ( i_width != '' )
	{
		pad_len = Number(i_width) - s.length;
		if( 0 < pad_len )
		{
			if ( align == 'left' )
			{
				s = s + str_repeat(right_pad_char, pad_len);
			}
			else
			{
				s = str_repeat(left_pad_char, pad_len) + s;
			}
		}
	}

	return s;
}

//------------------------------------------------------------
// local function
//------------------------------------------------------------
function _sprintf_s( i_flags, i_width, i_precision, i_type, i_value )
{
	var align;
	var left_pad_char;		// case align=right
	var right_pad_char;		// case align=left
	var pad_len;
	var s;
	
	
	s = String(i_value);

	align          = (0 <= i_flags.search(/\-/)) ? 'left' : 'right';
	left_pad_char  = (0 <= i_flags.search(/0/) ) ? '0' : ' ';
	right_pad_char = ' ';

	if( i_precision != '' )
	{
		s = substr_b( s, 0, Number(i_precision.substr(1)) );
	}

	if( i_width != '' )
	{
		pad_len = Number(i_width) - strlen_b(s);
		if( 0 < pad_len )
		{
			if ( align == 'left' )
			{
				s = s + str_repeat(right_pad_char, pad_len);
			}
			else
			{
				s = str_repeat(left_pad_char, pad_len) + s;
			}
		}
	}

	return s;
}

//------------------------------------------------------------
// local function
//------------------------------------------------------------
function _sprintf_x( i_flags, i_width, i_precision, i_type, i_value )
{
	// -	左詰
	// 0	i_precision省略時、左詰め文字
	var align;
	var left_pad_char;		// case align=right
	var right_pad_char;		// case align=left
	var pad_len;
	var s;
	
	s = '';
	s = hex( Math.floor(i_value) );
	s = (i_type == 'X') ? s.toUpperCase() : s.toLowerCase();

	align          = (0 <= i_flags.search(/\-/)) ? 'left' : 'right';
	left_pad_char  = (0 <= i_flags.search(/0/) && i_precision == '') ? '0' : ' ';
	right_pad_char = ' ';

	if ( i_precision != '' )
	{
		s = (s == '0') ? '' : s;
		
		pad_len = Number(i_precision.substr(1)) - s.length;
		if ( 0 < pad_len )
		{
			s = str_repeat('0', pad_len) + s;
		}
	}

	if( i_width != '' )
	{
		pad_len = Number(i_width) - s.length;
		if( 0 < pad_len )
		{
			if ( align == 'left' )
			{
				s = s + str_repeat(right_pad_char, pad_len);
			}
			else
			{
				s = str_repeat(left_pad_char, pad_len) + s;
			}
		}
	}

	return s;
}

//============================================================
// string hex( number i_num )
//============================================================
function hex( i_num )
{
	var num  = Number(i_num);
	var str  = '';
	
	//----------------------------------------
	// 符号なし右シフトがないため、負数の右シフトは無限ループになる
	// 0xF0FFFFFF >> 4	--> 0xFF0FFFFF
	// 下位から上位へシフトして、ゼロになったら終わり、という判定を追加した
	//----------------------------------------
	var mask = 0xF;
	
	do {
		str = "0123456789ABCDEF".substr((num & 0xF), 1) + str;
		num  >>= 4;
		mask <<= 4;
		
	} while( num != 0 && mask != 0 )

	return str;
}


//============================================================
// string oct( number i_num )
//============================================================
function oct( i_num )
{
	var bin_str;
	var str;
	var s, e;
	
	bin_str = bin( i_num );
		
	if ( bin_str.length < 3 )
	{
		e = bin_str.length;
	}
	else
	{
		e = bin_str.length % 3;
		if ( e == 0 ) e = 3;
	}
	
	
	str = '';
	for ( s = 0; s < bin_str.length; s = e, e += 3 )
	{
		buf = bin_str.substring(s, e);
		buf = bin2oct( buf );
		str += buf;
	}
	
	return str;
	
	
	function bin2oct( i_bin_str )
	{
		var chr;
		var bin;
		var mask;
		var num;
		
		num  = 0;
		mask = 1;
		for ( var i = i_bin_str.length - 1; 0 <= i; --i )
		{
			chr = i_bin_str.substr(i,1);
			bin = Number(chr);
			
			num += (mask * bin);
			mask <<= 1;
		}
		
		return String(num);
	}
}


//============================================================
// string bin( number i_num )
//============================================================
function bin( i_num )
{
	var num  = Number(i_num);
	var str  = '';
	
	//----------------------------------------
	// 符号なし右シフトがないため、負数の右シフトは無限ループになる
	// 参照：hex()
	//----------------------------------------
	var mask = 0x1;
	
	do {
		str = String(num & 0x1) + str;
		num  >>= 1;
		mask <<= 1;
		
	} while( num != 0 && mask != 0 )

	return str;
}


function str_repeat( i_str, i_repeat )
{
	var arr = new Array();
	
	for ( var i = i_repeat; i > 0; --i )
	{
		arr[ arr.length ] = i_str;
	}
	
	return arr.join('');
}


function strlen_b( i_str )
{
	var len;
	
	len = 0;
	for ( var i = 0; i < i_str.length; ++i )
	{
		if ( i_str.charCodeAt(i) < 0x100 )
		{
			len++;
		}
		else
		{
			len += 2;
		}
	}
	
	return len;
}

function substr_b( i_str, i_pos, i_len )
{
	var type_arr = new Array();
	var char_arr = new Array();
	var s;
	
	for ( var i = 0; i < i_str.length; ++i )
	{
		if ( i_str.charCodeAt(i) < 0x100 )
		{
			// ascii
			type_arr[ type_arr.length ] = 0;
			char_arr[ char_arr.length ] = i_str.substr(i,1);
		}
		else
		{
			// multibyte 1st
			type_arr[ type_arr.length ] = 1;
			char_arr[ char_arr.length ] = i_str.substr(i,1);
			
			// multibyte 2nd
			type_arr[ type_arr.length ] = 2;
			char_arr[ char_arr.length ] = i_str.substr(i,1);
		}
	}
	
	type_arr = type_arr.slice( i_pos, i_len );
	char_arr = char_arr.slice( i_pos, i_len );
	
	if ( 0 < type_arr.length )
	{
		// 先頭、最後が漢字をまたいでいないか？
		if ( type_arr[0] == 2 )
		{
			type_arr[0] = 0;
			char_arr[0] = ' ';
		}
		if ( type_arr[type_arr.length - 1] == 1 )
		{
			type_arr[type_arr.length - 1] = 0;
			char_arr[char_arr.length - 1] = ' ';
		}
	}
	
	s = '';
	for ( var i = 0; i < type_arr.length; ++i )
	{
		if ( type_arr[i] == 0 ||  type_arr[i] == 1 )
		{
			s += char_arr[i];
		}
	}
	
	return s;
}

