/* base.js
* Applicationに左右されない
* 共通的なjavascript
function enter_click(e, control_or_id) {
window.onerror = function(arg1,arg2,arg3) {
function changeStyle(control_or_id, strStyleName, strStyleValue) {
function getCurrencyString(strcurrency) {
function changeDisableControl(target_control_or_id, select_value, disabled_value, enabled_value) {
function getControl(target_control_or_id) {
function getID(target_control_or_id) {
function strToCase(target_control_or_id, toCase) {
function setFocus(id_or_control) {
function SetSelectText(obj, id_name_or_block) {
function SetSelectValue(obj, id_name_or_block) {
function SetSelectEditText(obj, separator, id_name_or_block) {
function setValue(control_or_id, value) {
function setRadioValue(radioGroup, set_value) {
function setOpenerValue(id_name, value) {
function setControlsValue(id_block) {
function setStyleColor(id, color) {
function setHidden()
function getType(control_or_id) {
function getQuery() {
function getAgentVersion() {
function getSelectOptionText(obj)
function getRadioValue(radioGroup) {
function getValue(id_name) {
function ShowDisp(ch) { 
function print_out() {
function disp_print_button(link) {
function WindowOpenWithTagValue(base_url, add_tag_id, target, query_string, window_params) {
function changeSubmit(href) {
function dispExplain(ch, display) {
function isIE() {
function isGecko() {
function hrefWithParams(url, param_name_block) {
function ChangeDisp(ch) { 
function createXmlhttp() {
function ReactSelected(id, path, disp_id) {
ZipToAddress
function Sleep( T ){
function appendOpenerValue(id_name, value) {
function removeOpenerValue(id_name, value) {
function clearControls(id_block) {
function SubmitAndClose() {
function MoveParentWindow(url) {
function OpenerChangeSubmit(href) {
function DispParent(div_id_name, value) {
function KeyDown(key)
function mouseOverOut(obj,flg) {
function ChangeImage(obj, img_name1, img_name2) {
function rollOver(obj,val,id) {
function jumpUrl(url, flg) {
function displayMode(mode) {
function mouseCursor(id) {
function mouseClick(id) {
function printf() {
function sprintf() {
function va_sprintf(args) {
function _dopr_fmtnum(value, base, dosign, ljust, len, zpad)
function _dopr_fmtstr(value, ljust, field_len, llen)
function _dopr_fromCharCode(code)
*/


function getWidth()
  {
   if ( document.body.clientWidth ) {
    return document.body.clientWidth;
   }
   else {
    return window.innerWidth;
   }
  }
  function getHeight()
  {
   if ( document.body.clientHeight ) {
    return document.body.clientHeight;
   }
   else {
    return window.innerHeight;
   }
  }

/**
 * ひらがなをカタカナに変換します。
 * 使用例：
 * <input type="text" onchange="toKatakana(this);" id="DEALER_NAME_KANA" name="DEALER_NAME_KANA" value="{$DEALER_NAME_KANA}" size="{math equation="ceil(50*slope + first_value)" slope=$slope  first_value=$first_value}" maxlength="50" />
 */
function toKatakana(field) {
	if (( navigator.userAgent.toLowerCase().indexOf("mac") != -1 ) && (navigator.userAgent.toLowerCase().indexOf("win") != -1)){
		return;
	}
	hiragana = "あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをんがぎぐげござじずぜぞだぢづでどばびぶべぼぁぃぅぇぉっゃゅょぱぴぷぺぽ";
	katakana = "アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンガギグゲゴザジズゼゾダヂヅデドバビブベボァィゥェォッャュョパピプペポ";
	str = "";
	for (i=0; i<field.value.length; i++) {
		c = field.value.charAt(i);
		n = hiragana.indexOf(c,0);
		if (n >= 0) {
			c = katakana.charAt(n);
		}
		str += c;
	}
	field.value = str;
}

/**
 * 半角カタカナを全角カタカナに変換します。
 */
function toZenkakuKana(field) {
	if (!( (navigator.userAgent.indexOf("MSIE") != -1) && (navigator.userAgent.toLowerCase().indexOf("win") != -1) )) {
		return;
	}
	txt = "ｱｲｳｴｵｶｷｸｹｺｻｼｽｾｿﾀﾁﾂﾃﾄﾅﾆﾇﾈﾉﾊﾋﾌﾍﾎﾏﾐﾑﾒﾓﾔﾕﾖﾗﾘﾙﾚﾛﾜｦﾝｧｨｩｪｫｬｭｮｯ､｡ｰ｢｣ﾞﾟ･";
	zen = "アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンァィゥェォャュョッ、。ー「」゛゜・";
	zen2= "ガギグゲゴザジズゼゾダヂヅデドバビブベボパピプペポ";
	han = "ｶﾞｷﾞｸﾞｹﾞｺﾞｻﾞｼﾞｽﾞｾﾞｿﾞﾀﾞﾁﾞﾂﾞﾃﾞﾄﾞﾊﾞﾋﾞﾌﾞﾍﾞﾎﾞﾊﾟﾋﾟﾌﾟﾍﾟﾎﾟ";
	str = "";
	var j;
	for (i=0; i < field.value.length; i++) {
		c = field.value.charAt(i);
		cnext = field.value.charAt(i+1);
		n = txt.indexOf(c,0);
		if ( cnext == "ﾞ" || cnext == "ﾟ") {
			for (j=0; j < han.length ; j=j+2) {
				if ( han.substring(j,j+2) == ( c+cnext) ) {
					str += zen2.charAt(j/2);
					i = i+1;
					break;
				}
			}
		}
		if (!( cnext == "ﾞ" || cnext == "ﾟ") || (j >= han.length)) {
			if (n >= 0) {
				str += zen.charAt(n);
			} else {
				str += c;
			}
		}
	}
	field.value = str;
}


/*
未使用
*/
function addBookmark(title,url) {
     if (window.sidebar) {
         window.sidebar.addPanel(title, url,"");
     } else if( document.all ) {
         window.external.AddFavorite( url, title);
     } else if( window.opera && window.print ) {
         return true;
     }
}

/*
未使用
tableコントロールのid名を受け取り
横軸にx縦軸にy番目のcellオブジェクトを返却する
*/
function cell(id, x, y) {
	table = document.getElementById(id);
	row = table.rows.item(y);
	cell = row.cells.item(x);
	return cell.firstChild.data;
}


/**
 * onkeydownイベントやクリックイベントなどに設定され
 * キー入力がEnterキーであった場合
 * に指定されたコントロールにクリックイベントを発生させる
 * 使用例：
 * <input class="ime-dis" type="password" name="menu_PASSWD" id="menu_PASSWD" alt="パスワード" onkeydown="enter_click(event,\'exec_login\');" />

 */
function enter_click(e, control_or_id) {
	if(e.keyCode == 13){
		var control = getControl(control_or_id);
		control.click();
	}
}




/**
 * コントロールにstyleを設定する
 * @param control_or_id
 * @param strStyleName
 * @param strStyleValue
 * @return
 */
function changeStyle(control_or_id, strStyleName, strStyleValue) {
	var control = getControl(control_or_id);
	switch (strStyleName) {
		case 'text-align':
			control.style.textAlign =strStyleValue;
			break;
		case 'ime-mode':
			control.style.imeMode = strStyleValue;
			break;
		case 'color':
			control.style.color = strStyleValue;
			break;
		default:
			var message = 'JAVASCRIPT::changeStyleにおいて設定されていない。strStyleNameです。strStyleName[' + strStyleName + ']';
			alert(message);
			return false;
	}
	return true;
}

/**
 * コントールにStyle.colorを設定する
 * @param id
 * @param color
 * @return
 */
function setStyleColor(id, color) {
	document.getElementById(id).style.color = color;

}


/**
 * 数値を引数に通貨型のフォーマット（123,123)に変換して返却する
 * @param strcurrency
 * @return
 */
function getCurrencyString(strcurrency) {
	//カンマの削除
	strcurrency = strcurrency.replace(/,/g, '');
	if(!isNaN(strcurrency)){
		//数値だったら
		//小数部分と整数部分に分解する
		var currency = Math.round(strcurrency);
		var decimal = strcurrency.replace(currency, '');
		str1 = String(currency);
		str2 = "";
		len = str1.length;
		j = 0;
		for(i = (len-1); i >= 0; i--){
			j++;
			z = str1.substr(i,1);
			str2 = z + str2;
			a = j;
			b = 3;
			while(a >= b){
				a -= b;
			}
			if(i != 0 && a == 0) str2 = "," + str2;
		}
		if (decimal == '') {
			strcurrency = str2;
		} else {
			strcurrency = str2 + decimal;
		}
	}else{
		//strcurrency = "";
		alert("数値を入力して下さい");
	}
	return strcurrency;
}


/**
 * //コントロールの表示・非表示を切り替える
 * select_valueがdisabled_valueであれば非表示
 * select_valueがenabled_valueであれば表示する
 * @param target_control_or_id
 * @param select_value
 * @param disabled_value
 * @param enabled_value
 * @return
 */
function changeDisableControl(target_control_or_id, select_value, disabled_value, enabled_value) {
	var control = getControl(target_control_or_id);
	if (select_value == disabled_value) {
		//コントロールを表示する
		control.disabled == true;
	}
	if (select_value == enabled_value) {
		//コントロールを表示する
		control.disabled == false;
	}
	
	//コントロールの表示・非表示を切り替える
	if (control.disabled == true) {
		//コントロールを非表示にする
		control.disabled == null;
	} else {
		//コントロールを表示する
		control.disabled == true;
	}
}

/**
 * IDまたはコントロールを受け取りそのコントロールを返却する
 * @param target_control_or_id
 * @return
 */
function getControl(target_control_or_id) {
	var type_of = getType(target_control_or_id);
	var control = null;
	if (type_of == 'string') {
		control = document.getElementById(target_control_or_id);
		if (control == null) {
			var message = 'base.js内getControlにてid:[' + target_control_or_id + ']がありません。';
			alert(message);
			return false;
		}
	} else {
		control = target_control_or_id;
	}
	return control;
}

/**
 * IDまたはコントロールを受け取りその
 * コントロールを返却する
 * @param target_control_or_id
 * @return
 */
function getControlWithTargetWindow(target_control_or_id, target_window) {
	if (target_window == undefined || target_window == null) {
		alert(target_window + 'はnullまたはundefinedです。');
		return false;
	}
	var type_of = getType(target_control_or_id);
	var control = null;
	if (type_of == 'string') {
		control = target_window.document.getElementById(target_control_or_id);
		if (control == null) {
			var message = 'id:[' + target_control_or_id + ']がありません。';
			alert(message);
			return false;
		}
	} else {
		control = target_control_or_id;
	}
	return control;
}

/**
 * IDまたはコントロールを受け取り
 * IDに変換して返却する
 * @param target_control_or_id
 * @return
 */
function getID(target_control_or_id) {
	var control = getControl(target_control_or_id);
	return control.id;
}



/**
 * コントロールまたは、IDを受け取りそのコントロールの値を大文字または、小文字に変換する
 * @param target_control_or_id
 * @param toCase
 * @return
 */
function strToCase(target_control_or_id, toCase) {
	var control = getControl(target_control_or_id);
	var return_value='';
	switch (control.tagName) {
		case "SELECT":
			var idx  = control.selectedIndex;
			return_value = control.options[idx].value;
			if (toCase == 'upper') {
				control.options[idx].value = return_value.toUpperCase();
			} else if (toCase == 'lower') {
				control.options[idx].value = return_value.toLowerCase();
			} else {
				var message = '設定されていない。toCaseです。[' + toCase + ']';
				alert(message);
				return false;
			}
			break;
		case "INPUT":
			return_value = control.value;
			if (toCase == 'upper') {
				control.value = return_value.toUpperCase();
			} else if (toCase == 'lower') {
				control.value = return_value.toLowerCase();
			} else {
				var message = '設定されていない。toCaseです。[' + toCase + ']';
				alert(message);
				return false;
			}
			break;
		case "DIV":
			var message = 'DIVタグはstrToCaseに対応しません。';
			alert(message);
			return false;
			break;
		default:
			alert('JAVASCRIPT base.js getValueにて設定されていないTAG名です。:[' + control.tagName + ']');
	}
	
}

///// seter >> /////

/**
 * コントロールまたは、IDを受け取りそのコントロールにフォーカスを当てる
 */
function setFocus(id_or_control) {
	var control = getControl(id_or_control);
	control.focus();
}


//******************************************
//selectタグで選択されたTEXTを
//id_nameで指定されたtextboxに表示する
//******************************************
//使用例：<select name="maker" onchange="SetSelectText(this, 'SRUMTA_MAKNM');">
//
function SetSelectText(obj, id_name_or_block) {
	///// TEXTの取得 >> /////
	//selectの値を取得
	var index = obj.selectedIndex;
	var value = obj.options[index].text;
	///// TEXTの取得 << /////
	var ids = id_name_or_block.split(",");
	for (var no in ids) {
		var id_name = ids[no];
		//取得した値をセット
		setValue(id_name, value);
	}
}


//******************************************
//selectタグで選択されたValueを
//id_nameで指定されたコントロールに値を表示する
//******************************************
//使用例：<select name="maker" onchange="SetSelectValue(this, 'SRUMTA_MAKNM');">
//
function SetSelectValue(obj, id_name_or_block) {
	///// 値の取得 >> /////
	//selectの値を取得
	var index = obj.selectedIndex;
	var value = obj.options[index].value;
	///// 値の取得 << /////

	var ids = id_name_or_block.split(",");
	for (var no in ids) {
		var id_name = ids[no];
		//取得した値をセット
		setValue(id_name, value);	
	}
}




//******************************************
//selectタグで選択されたTEXTを
//separator以降の文字列を指定したidに設定する
//id_nameで指定されたtextboxに表示する
//******************************************
//使用例：<select name="maker" onchange="SetSelectEditText(this, '--', ',SRUMTA_MAKNM');">
//
function SetSelectEditText(obj, separator, id_name_or_block) {
	
	///// selectコントロールで選択されたTEXT値を取得 >> /////
	var index = obj.selectedIndex;
	var select_text_block = obj.options[index].text;
	///// selectコントロールで選択されたTEXT値を取得 << /////

	///// 選択されたTEXT値からseparatorで配列に格納する >> /////
	if (select_text_block == '--') {
		var ids = id_name_or_block.split(",");
		for (var no in ids) {
			var id_name = ids[no];
			if (id_name != '') {
				setValue(id_name, '');
			}
		}
	} else {
		var select_texts = select_text_block.split(separator);
		var ids = id_name_or_block.split(",");
		for (var no in select_texts) {
			var select_text = select_texts[no];
			var id_name = ids[no];
			///// 指定されたコントロールへ表示する >> /////
			if (id_name != '') {
				setValue(id_name, select_text);
			}
			///// 指定されたコントロールへ表示する << /////
		}
	}	
	///// 選択されたTEXT値からseparatorで配列に格納する << /////
}


/**
 * もしcontrol_or_idの値が空文字列であれば、
 * valueを入力する
 * 
 * @param control_or_id
 * @param value
 * @return
 */
function ifNullSetValue(control_or_id, value) {
	var target_value = getValue(control_or_id);
	if (target_value == '') {
		//空文字列だった
		setValue(control_or_id, value);
	}
}

//*****************************************
//id名を指定して値を設定する
//*****************************************
//control			tag_name			|		tag_type
//				ie6			firefox		|	ie6			firefox
//radiobox		INPUT		INPUT(配列)	|	radio		radio
//textbox		INPUT		INPUT		|	text		text
//select		SELECT		OPTION(配列)|	select-one	undefined
//textarea		TEXTAREA	TEXTAREA	|	textarea	textarea
function setValue(control_or_id, value) {
	var elem = getControl(control_or_id);
	
	var case_type;
	var tag_name;
	var tag_type;
	var is_ie = isIE();
	if (is_ie == true) {
		//IE
		case_type = 0;
		tag_name = elem.tagName;
		tag_type = elem.type;
	} else {
		//IE以外
		if (elem[0]) {
			//配列だった
			case_type = 1;
			tag_name = elem[0].tagName;
			tag_type = elem[0].type;
		} else {
			case_type = 2;
	 		tag_name = elem.tagName;
			tag_type = elem.type;
		}
	}
	switch (tag_name) {
		case 'OPTION'://firefox
		case 'SELECT'://IE
			var count = elem.options.length;
			for (index=0; index<count; index++) {
				current_value = elem.options[index].value;
				if (current_value == value) {
					elem.selectedIndex = index;
					break;
				}
			}
			break
		case 'TEXTAREA':
		case 'INPUT':
			if (tag_type == 'radio') {
				//radiobox
				setRadioValue(elem, value);
			} else {
				elem.value = value; 
			}
			break;
		case 'SPAN':
		case 'DIV':
			elem.innerHTML = value;
			break;
		default:
			var id_name = getID(control_or_id);
			var message = id_name + ":is_ie[" + is_ie + "]case_type[" + case_type + "]tag_name[" + tag_name + "]tag_type[" + tag_type + "]";
			alert('JAVASCRIPT base.js setValueにて設定されていないTAG名です。:' + message);
	}
}



/**
 * ラジオボタンのコントロールに対して
 * valueがset_valueのコントロールを選択状態にする
 * 
 * @param radioGroup string ラジオグループ名
 * @param set_value string radioGroup内のラジオボタンのvalueがset_valueであるコントロールを選択状態にする
 * @return
 */
function setRadioValue(radioGroup, set_value) {
	var exists_set_value = false;
	if (radioGroup.length) {
		for (i=0; i<radioGroup.length; i++) {
			if (radioGroup[i].value == set_value) {
				radioGroup[i].checked = true;
				exists_set_value = true;
			}
		}
	} else {
		if (radioGroup.value == set_value) {
			exists_set_value = true;
			radioGroup.checked = true;
		} else {
			radioGroup.checked = false;
		}
	}
	return exists_set_value;
}


//*****************************************
//親画面(Opener)上のid名を指定して値を設定する
//*****************************************
function setOpenerValue(id_name, value) {
	var elem = window.opener.document.getElementById(id_name);
	if(elem) {
		switch (elem.tagName) {
			case 'SELECT':
				var count = elem.options.length;
				for (index=0; index<count; index++) {
					current_value = elem.options[index].value;
					if (current_value == value) {
						elem.selectedIndex = index;
						break;
					}
				}
				break
			case 'TEXTAREA':
			case 'INPUT':
				elem.value = value; 
				break;
			case 'SPAN':
			case 'DIV':
				elem.innerHTML = value;
				break;
			default:
				alert('JAVASCRIPT base.js setOpenerValueにて設定されていないTAG名です。:[' + elem.tagName + ']');
		}
		
	} else {
		alert('JAVASCRIPT base.js setValueにてid名：' + id_name + 'がありません。');
	} 
}



//*****************************************
//id名と値のブロックを引数に値をセットする
//使用例：
//<input type="button" name="reset" onclick="setControlsValue('EXPORT_SQ=2,EXPORT_CD=2,CAR_NAME=name');" value="クリア" />
//*****************************************
function setControlsValue(id_block) {
	var id_and_values = id_block.split(",");
	for (var no in id_and_values) {
		var id_and_value = id_and_values[no];
		var id_or_values = id_and_value.split("=");
		var id = id_or_values[0];
		var value = id_or_values[1];
		setValue(id, value);
	}
}



/**
 * 未使用
 * @return
 */
function setHiddenFromSelect() {
	var ary = new Array(2);
	ary[0]="maker";
	ary[1]="model";
	
	for(i=0; i<ary.length; i++) {
		var obj=document.getElementById(ary[i]);
		var idx= (obj==null) ? 0 :obj.selectedIndex;
		var hid=document.getElementById('hid_'+ary[i]);
		hid.value = (idx==0) ? '' : obj.options[idx].text;
	}
}
///// seter << /////

///// geter >> /////

/**
 * control_or_idのタイプを取得します。
 * 
 */
function getType(control_or_id) {
	var type_of = typeof control_or_id;
	var result = '';
	switch (type_of) {
		case 'string':
			result = type_of;
			break;
		case 'object':
			result = type_of;
			break;
		case 'select-one'://
			result = type_of;
			break;
		default:
			var message = 'JavaScript::Base.js内の関数getTypeにてエラーが発生しました。設定されていないtype_ofです。[' + type_of + ']control_or_id[' + control_or_id + ']';
			alert(message);
			return false;
	}
	return result;
}


/**
 * 未使用
 * クエリ文字列を取得します。
 * @return
 */
function getQueryString() {
	url = new String(window.location);
	query = new Array();
	query = url.split("?");
	if ( !!query[1] ) {
		return query[1];
	} else {
		return "";
	}
	return query;
}


/**
 * ブラウザのバージョンを返却します。
 * @return
 */
function getAgentVersion() {
   if (navigator.userAgent.match(/msie (\d)/i))
	  v = (eval(RegExp.$1) >= 5) ? 1 : 0;
   else if (self.innerWidth)
	  v = (eval(navigator.appVersion.charAt(0)) >= 4) ? 1 : 0;
   else v = 0;

	return v;
}

/**
 * select1コントロールのＴＥＸＴを返却します。
 * @param obj
 * @return
 */
function getSelectOptionText(obj) {
	var idx  = obj.selectedIndex;
	var text = obj.options[idx].text;
	return text;
}


/**
 * ラジオグループの選択
 * @param radioGroup
 * @return
 */
function getRadioValue(radioGroup) {
	for (i=0; i<radioGroup.length; i++) {
		if (radioGroup[i].checked == true) {
			return radioGroup[i].value
		}
	}
}

//*****************************************
//id名を指定して値を取得する
//*****************************************
function getValue(id_name) {
	var elem;
	var type_of = typeof id_name;
	if (type_of == 'string') {
		elem = document.getElementById(id_name);
	} else if (type_of == 'select-one') {
		elem = id_name;
	} else if (type_of == 'object') {
		elem = id_name;
	} else {
		var message = '設定されていないtypeです。[' + type_of + ']';
		alert(message);
	}
	

	if(!elem) {
		alert('JAVASCRIPT base.js getValueにてid名：' + id_name + 'がありません。');
	}
	var return_value;
	switch (elem.tagName) {
		case "SELECT":
			var idx  = elem.selectedIndex;
			return_value = elem.options[idx].value;
			break;
		case "INPUT":
			return_value = elem.value; 
			break;
		case "DIV":
			return_value = elem.innerHTML;
			break;
		default:
			alert('JAVASCRIPT base.js getValueにて設定されていないTAG名です。:[' + elem.tagName + ']');
	}
	return return_value;
}

///// geter << /////



/**
 * 表示されていない場合表示する。
 */
function ShowDisp(ch) { 
	var obj=document.all && document.all(ch) || document.getElementById && document.getElementById(ch);
	if(obj && obj.style) {
		if ("none" == obj.style.display) {
			obj.style.display = "";
		} else {
		//	obj.style.display = "none";
		}
	}
}




function print_out() {
   /* print() が使えるブラウザかどうかを判断 */
   if (navigator.userAgent.match(/msie (\d)/i))
	  v = (eval(RegExp.$1) >= 5) ? 1 : 0;
   else if (self.innerWidth)
	  v = (eval(navigator.appVersion.charAt(0)) >= 4) ? 1 : 0;
   else v = 0;

   /* print() が使えるブラウザなら印刷を実行 */
   if (v) self.print();
   else alert("お使いのブラウザではこの機能は利用できません");
}

function disp_print_button(link) {

	/* print() が使えるブラウザかどうかを先に判断しておく */
	if (navigator.userAgent.match(/msie (\d)/i))
	   v = (eval(RegExp.$1) >= 5) ? 1 : 0;
	else if (self.innerWidth)
	   v = (eval(navigator.appVersion.charAt(0)) >= 4) ? 1 : 0;
	else v = 0;
	
	/* print() が使えるブラウザなら印刷ボタンを表示 */
	if (v) {
		document.write("<a href=\"#\" onClick=\"print_out()\" title=\"印刷\">");
		document.write(link);
		document.write("</a>");
	}
}

//
//	指定したタグの値をWindow名とするWindowを開く
//
// @param strung base_url 
//					開くWindowのbase_url
// @param string add_tag_id
//					 このタグのに設定されている値を 開くWindowのファイル名とする
// @param string target
//					開くウィンドウ名
// @param string query_string
//					ウィンドOpen時に付加したいクエリストリング
// @param string params
//					 開くWindowに渡されるparamater
// 使用例：
// <button onclick="WindowOpenWithTagValue('/common/tools/select_hoby/index/hoby_id_block/', 'hidden_hoby_id_block', '_blank', '', 'width=350,height=600,menubar=no,resizable=yes,scrollbars=yes')">趣味を選択</button>
//
var child_window;
function WindowOpenWithTagValue(base_url, add_tag_id_or_block, target, query_string, window_params) {
	var tag_value = '';
	var tag_id = '';
	var url = rtrim(base_url, '/');
	if (add_tag_id_or_block != '') {
		if (add_tag_id_or_block.indexOf(",", 0) != -1) {
			//,を含む(複数設定されていた)
			add_tag_ids = add_tag_id_or_block.split(",");
			for (i=0; i < add_tag_ids.length; i++) {
				add_tag_id = add_tag_ids[i];
				tag_value = getValue(add_tag_id);
				//もし、tag_valueに/が含まれる場合_SLASH_に変換する
				tag_value = tag_value.replace(/\//g, "_slash_");
				tag_id = getID(add_tag_id);
				if (tag_value != '') {
					//小文字に変換
					tag_id = tag_id.toLowerCase();
					url = url + '/' + tag_id + '/' + tag_value;
				}
			}
		} else {
			//.を含まない
			add_tag_id = add_tag_id_or_block;
			tag_value = getValue(add_tag_id);
			//もし、tag_valueに/が含まれる場合_SLASH_に変換する
			tag_value = tag_value.replace(/\//g, "_slash_");
			tag_id = getID(add_tag_id);
			if (tag_value != '') {
				//小文字に変換
				tag_id = tag_id.toLowerCase();
				url = url + '/' + tag_id + '/' + tag_value;
			}
		}
	}
	query_string = '/' + ltrim(query_string, '/');
	url = url + query_string;
	child_window = window.open(url, target, window_params);
}


/**
 * Windowをモーダルで開きます
 * @param base_url
 * @param add_tag_id_or_block
 * @param width_px
 * @param height_px
 * @param _scroll	//画面をスクロールするかしないかを設定する Trueする
 * @return
 */
function ModalWindowOpenWithTagValue(base_url, add_tag_id_or_block, width_px, height_px, _scroll) {
	var tag_value = '';
	var tag_id = '';
	var url = rtrim(base_url, '/');
	if (add_tag_id_or_block != '') {
		if (add_tag_id_or_block.indexOf(",", 0) != -1) {
			//,を含む
			add_tag_ids = add_tag_id_or_block.split(",");
			for (i=0; i < add_tag_ids.length; i++) {
				add_tag_id = add_tag_ids[i];
				tag_value = getValue(add_tag_id);
				//もし、tag_valueに/が含まれる場合_SLASH_に変換する
				tag_value = tag_value.replace(/\//g, "_slash_");
				tag_id = getID(add_tag_id);
				if (tag_value != '') {
					url = url + '/' + tag_id + '/' + tag_value;
				}
			}
		} else {
			//.を含まない
			add_tag_id = add_tag_id_or_block;
			tag_value = getValue(add_tag_id);
			//もし、tag_valueに/が含まれる場合_SLASH_に変換する
			tag_value = tag_value.replace(/\//g, "_slash_");
			tag_id = getID(add_tag_id);
			if (tag_value != '') {
				url = url + '/' + tag_id + '/' + tag_value;
			}
		}
	}
	//画面をスクロールするかしないかを設定する Trueする
	child_window = Cross_showModalDialog(url, window, width_px, height_px, _scroll);
}


//******************************************
//form actionの送信先を変更して送信する
//******************************************
function changeSubmit(href) {
	if (href != '' && href != undefined) {
		if (href.indexOf("://", 0) != -1) {
			//"://"を含む
			document.forms[0].action = href;
		} else {
			document.forms[0].action = "http://" + location.host + href;
		}
	}
	document.forms[0].submit();
}








/*
 * 
 * html例：
	<div onclick="dispExplain('explain');">一覧に表示されているデータについて(表示はクリック)</div>
<div id="explain" style="display: none;">
	ここに表示されている車両一覧は、Evolutionで登録されて夜間バッチにて
	<br />このシステムの在庫車両として登録され、
</div>
 * 
 */
function dispExplain(ch, display) {

	var obj=document.all && document.all(ch) || document.getElementById && document.getElementById(ch);
 	if (obj && obj.style) {
		if (obj.style.display=="none") {
			if (display == undefined) {
				obj.style.display="";
			} else {
				obj.style.display=display;
			}
		} else {
			if (display == undefined) {
				obj.style.display="none";
			} else {
				obj.style.display=display;
			}
		}
	}
}


function isIE() {
	return (navigator.userAgent.indexOf("MSIE") > -1);
}

function isGecko() {
	var _mf_ = navigator.userAgent.match(/(gecko|firefox)/i) != null; //Moz/Firefox
//	if (_mf_ == true) {
		//FireFox
//(navigator.userAgent.indexOf("Gecko") > -1);
	return _mf_;
}


/**
 * 
 *  HTMLのコントロールに設定されている値をクエリ文字列として
 * 		指定されたURLに画面遷移させる
 * @param string url 画面遷移するURL
 * @param string param_name_block URLに遷移するときにクエリ文字列に設定したい
 * 									HTMLのidを設定する
 * 
 */
function hrefWithParams(url, param_name_block) {
	var param_names = param_name_block.split(',');
	var param_string = '';
	for (var no in param_names) {
		var id_name = param_names[no];
		var value = getValue(id_name);
		if (param_string == '') {
			param_string = '?' + id_name + '=' + value;
		} else {
			param_string += '&' + id_name + '=' + value;
		}
	}
	document.location.href=url + param_string;
}



/**
 * 表示・非表示を切り替える
 */
function ChangeDisp(ch) { 
	var obj=document.all && document.all(ch) || document.getElementById && document.getElementById(ch);
	if(obj && obj.style) {
		if ("none" == obj.style.display) {
			obj.style.display = "";
		} else {
			obj.style.display = "none";
		}
	}
}

//*****************************************
//XML HTTPオブジェクト作成
//*****************************************
function createXmlhttp() {
	var ajax = false;
	// IE以外
	if(window.XMLHttpRequest) {
		ajax = new XMLHttpRequest();
	// IE用
	} else if(window.ActiveXObject) {
		try {
			ajax = new ActiveXObject("Msxml2.XMLHTTP");
		} catch(e) {
			//IE
			ajax = new ActiveXObject("Microsoft.XMLHTTP");	
		}
	}
	return ajax;
}


/**
 * プルダウンメニュー同志の連携などがある場合に使用する
 * @param string id 選択されたデータを表すID
 * @param string path AjaxのDOCUMENT_ROOTからのPATH
 * @param string disp_id Ajaxより返却されたデータを表示するdivタグのid名を指定する
	使用例：
	<select name="PREFECTURE_SQ" onchange="ReactSelected(this.options[this.selectedIndex].value, '/application/common/Ajax/react_MUNICIPALITY.php','disp_cond');">
		{html_options options=$PREFECTURE_SQ_options selected=$PREFECTURE_SQ}
	</select></td>

	
 */
function ReactSelected(id, path, disp_id) {
	var xmlhttp = new createXmlhttp();
	var query = 'select_id=' + id;
	
	if(xmlhttp) {
		xmlhttp.open('POST', path);
		xmlhttp.onreadystatechange = function() {
			if(xmlhttp.readyState == 4 && xmlhttp.status == 200) {
				//結果を表示する
				var disp_element = document.getElementById(disp_id);
				disp_element.innerHTML = xmlhttp.responseText + '\n';
			}
		}
		xmlhttp.setRequestHeader("Content-Type" , "application/x-www-form-urlencoded");
		xmlhttp.send(query);
	}
}

/**
 * disp_idの値が空文字列であれば
 * プルダウンメニューとその他コントロールとの連携
 * などがある場合に使用する
 * @param string match_id
 * 				取得するデータのID
 * @param string match_field
 * 				get_table_nameテーブルの
 * 				このフィールドがmatch_idで取得された値同じレコードを抽出する
 * @param string get_table_name
 * 				返却する値を取得するテーブル名を指定する
 * @param string get_field
 * 				get_table_nameテーブルの返却するフィールド名
 * @param string disp_id 
 * 				Ajaxより返却されたデータを表示する
 * 				divタグのid名を指定する
 * 
	
	使用例：<select name="PREFECTURE_SQ" onchange="ifNullReactDisp(this,SERVICE_GUARANTEE_RATE,M_SERVICE_GUARANTEE_RATE,NPER,GUARANTEE_FEE_RATE);">
		{html_options options=$PREFECTURE_SQ_options selected=$PREFECTURE_SQ}
	</select></td>
 */
function ifNullReactDisp(match_id, match_field, get_table_name, get_field, disp_id, add_cond_field, add_cond_value_id) {
	var target_value = getValue(disp_id);
	if (target_value == '') {
		ReactDisp(match_id, match_field, get_table_name, get_field, disp_id, add_cond_field, add_cond_value_id);
	}
}

/**
 * プルダウンメニューとその他コントロールとの連携
 * などがある場合に使用する
 * @param string match_id
 * 				取得するデータのID
 * @param string match_field
 * 				get_table_nameテーブルの
 * 				このフィールドがmatch_idで取得された値同じレコードを抽出する
 * @param string get_table_name
 * 				返却する値を取得するテーブル名を指定する
 * @param string get_field
 * 				get_table_nameテーブルの返却するフィールド名
 * @param string disp_id 
 * 				Ajaxより返却されたデータを表示する
 * 				divタグのid名を指定する
 * 
	
	使用例：<select name="PREFECTURE_SQ" onchange="ReactDisp(this,SERVICE_GUARANTEE_RATE,M_SERVICE_GUARANTEE_RATE,NPER,GUARANTEE_FEE_RATE);">
		{html_options options=$PREFECTURE_SQ_options selected=$PREFECTURE_SQ}
	</select></td>
 */
function ReactDisp(match_id, match_field, get_table_name, get_field, disp_id, add_cond_field, add_cond_value_id) {
	var match_value = getValue(match_id);
	var add_cond_value = getValue(add_cond_value_id);
	var query = 'match_value=' + match_value + '&get_table_name=' + get_table_name + '&match_field=' + match_field + '&get_field=' + get_field + '&add_cond_field=' + add_cond_field + '&add_cond_value=' + add_cond_value;

	var path = '/application/common/Ajax/reactDisp.php';//固定
	var xmlhttp = new createXmlhttp();	
	if(xmlhttp) {
		xmlhttp.open('POST', path);
		xmlhttp.onreadystatechange = function() {
			if(xmlhttp.readyState == 4 && xmlhttp.status == 200) {
				setValue(disp_id, xmlhttp.responseText);
				var elem = getControl(disp_id);
				elem.onchange();
			}
		}
		xmlhttp.setRequestHeader("Content-Type" , "application/x-www-form-urlencoded");
		xmlhttp.send(query);
	}
}



/**
 * 郵便番号を送信し住所をコントロールへ表示させる
 * 
 * @param string id 選択されたデータを表すID
 * @param string path AjaxのDOCUMENT_ROOTからのPATH
 * @param string disp_id Ajaxより返却されたデータを表示するdivタグのid名を指定する
	使用例：<select name="PREFECTURE_SQ" onchange="ZipToAddress(this.options[this.selectedIndex].value, '/application/common/Ajax/react_MUNICIPALITY.php','disp_cond');">
		{html_options options=$PREFECTURE_SQ_options selected=$PREFECTURE_SQ}
	</select></td>
都道府県
市区町村 	
住所1 	
住所2
 */
function ZipToAddress(zip_text_control, ajax_path) {
	
	var zip_cd = getValue(zip_text_control);
	if (zip_cd == '') {
		alert('郵便番号を入力してください。');
		return false;
	}
	
	var query = 'zip_cd=' + zip_cd;
	

	var xmlhttp = new createXmlhttp();
	if(xmlhttp) {
		xmlhttp.open('POST', ajax_path);
		xmlhttp.onreadystatechange = function() {
			if(xmlhttp.readyState == 4 && xmlhttp.status == 200) {
				var response_txt = xmlhttp.responseText;
				
				//返却される文字列は、prefecture_id=value1,city_id=value2,address1_id=value3,address2_id=value4の形式
				var key_values = response_txt.split(',');
				for (var i=0; i < key_values.length; i++) {
					var key_value = key_values[i];
					var values = key_value.split('=');
					if (values.length != 2) {
						alert(zip_cd + 'は登録されていません。');
						break;
					} else {
						var set_control_id = values[0];
						var set_value = values[1];
						setValue(set_control_id, set_value);
					}
				}
			}
		}
		xmlhttp.setRequestHeader("Content-Type" , "application/x-www-form-urlencoded");
		xmlhttp.send(query);
	}
}


/**
 * 
 * 
 * @param T 秒を指定
 * @return
 */
function Sleep( T ){
	var d1 = new Date().getTime();
	var d2 = new Date().getTime();
	while( d2 < d1+1000*T ) {	//T秒待つ
		d2=new Date().getTime();
	}
}







//*****************************************
//Openerに対してid名を指定して値を設定する
//*****************************************
function appendOpenerValue(id_name, value) {
	var elem = window.opener.document.getElementById(id_name);
	if(elem) {
		switch (elem.tagName) {
			case 'SELECT':
				var count = elem.options.length;
				for (index=0; index<count; index++) {
					current_value = elem.options[index].value;
					if (current_value == value) {
						elem.selectedIndex = index;
						break;
					}
				}
				break
			case 'TEXTAREA':
			case 'INPUT':
				if (elem.value == '') {
					elem.value = value; 
				} else {
					elem.value = elem.value + ',' + value; 
				}
				
				break;
			case 'SPAN':
			case 'DIV':
				if (elem.innerHTML == '') {
					elem.innerHTML = value;
				} else {
					elem.innerHTML = elem.innerHTML + value;
				}
				break;
			default:
				alert('JAVASCRIPT base.js setOpenerValueにて設定されていないTAG名です。:[' + elem.tagName + ']');
		}
		
	} else {
		alert('JAVASCRIPT base.js setValueにてid名：' + id_name + 'がありません。');
	}
}


// id_nameのタグの値が例えば1,2,3となっていた場合
//引数valueが2であるとする
//実行後id_nameのタグの値が1,3となる
function removeOpenerValue(id_name, value) {
	var elem = window.opener.document.getElementById(id_name);
	if(elem) {
		switch (elem.tagName) {
			case 'TEXTAREA':
			case 'INPUT':
				if (elem.value != '') {
					var values = elem.value.split(",");
					var set_value = '';
					for (var no in values) {
						var current_value = values[no];
						if (current_value != value) {
							if (set_value == '') {
								set_value = current_value;
							} else {
								set_value = set_value + ',' + current_value;
							}
						}
					}
					elem.value = set_value;
				}
				
				break;
			case 'SPAN':
			case 'DIV':
				if (elem.innerHTML != '') {
					var values = elem.innerHTML.split(",");
					var set_value = '';
					for (var no in values) {
						var current_value = values[no];
						if (current_value != value) {
							if (set_value == '') {
								set_value = current_value;
							} else {
								set_value = set_value + ',' + current_value;
							}
						}
					}
					elem.innerHTML = set_value;
				}
				break;
			case 'SELECT':
				//removeはできない。
			default:
				alert('JAVASCRIPT base.js setOpenerValueにて設定されていないTAG名です。:[' + elem.tagName + ']');
		}
		
	} else {
		alert('JAVASCRIPT base.js getValueにてid名：' + id_name + 'がありません。');
	} 

}

// id_nameのタグの値が例えば1,2,3となっていた場合
//引数valueが2であるとする
//実行後id_nameのタグの値が1,3となる
function removeBlockValueAndSubmit(id_name, value) {
	var elem = getControl(id_name);
	if(elem) {
		switch (elem.tagName) {
			case 'TEXTAREA':
			case 'INPUT':
				if (elem.value != '') {
					var values = elem.value.split(",");
					var set_value = '';
					for (var no in values) {
						var current_value = values[no];
						if (current_value != value) {
							if (set_value == '') {
								set_value = current_value;
							} else {
								set_value = set_value + ',' + current_value;
							}
						}
					}
					elem.value = set_value;
				}
				
				break;
			case 'SPAN':
			case 'DIV':
				if (elem.innerHTML != '') {
					var values = elem.innerHTML.split(",");
					var set_value = '';
					for (var no in values) {
						var current_value = values[no];
						if (current_value != value) {
							if (set_value == '') {
								set_value = current_value;
							} else {
								set_value = set_value + ',' + current_value;
							}
						}
					}
					elem.innerHTML = set_value;
				}
				break;
			case 'SELECT':
				//removeはできない。
			default:
				alert('JAVASCRIPT base.js removeBlockValueにて設定されていないTAG名です。:[' + elem.tagName + ']');
		}
		document.forms[0].submit();
	} else {
		alert('JAVASCRIPT base.js getControlにてid名：' + id_name + 'がありません。');
	} 
}



//*****************************************
//id名を指定して値を消す
// 使用例：
// <input type="button" name="reset" onclick="clearControls('EXPORT_SQ,EXPORT_CD,CAR_SQ');" value="クリア" />
//*****************************************
function clearControls(id_block) {
	var ids = id_block.split(",");
	for (var no in ids) {
		var id_name = ids[no];
		var elem = document.getElementById(id_name);
		//divにtype属性はない
		if(elem) {
			switch (elem.type) {
				case 'select-one':
					elem.selectedIndex = 0;
					break;
				case 'text':
					elem.value = "";
					break;
				case 'textarea':
					elem.value = "";
					break;
				case 'hidden':
					elem.value = "";
					break;
				case 'checkbox':
					elem.checked = false;
					break;
				default:
					alert("JAVASCRIPT base.js clearControlsにて設定されていないtypeです。[" + elem.type + "]");
			}
		} else {
			alert('JAVASCRIPT base.js clearControlsにてid名：' + id_name + 'がありません。');
		}
	}
}



//*****************************
//フォームを送信ごWindowClose
//*****************************
function SubmitAndClose() {
	document.main_form.submit();
	window.close();
	return false;
}

//*************************************************
//子ウィンドウから親ウィンドウを画面遷移させる
//*************************************************
function MoveParentWindow(url) {
	window.opener.location.href = url;	
	window.close();
	return false;
}


function OpenerChangeSubmit(href) {

	if (href.indexOf("://", 0) != -1) {
		window.opener.document.forms[0].action = href;
	} else {
		window.opener.document.forms[0].action = "http://" + location.host + href;
	}
	
	window.opener.document.forms[0].submit();
}


//*************************************************
//親ウィンドウの指定されたIDにinnerTextする
//*************************************************
function DispParent(div_id_name, value) {
	var div_id = window.opener.document.getElementById(div_id_name);
	div_id.innerHTML = value;
}










function KeyDown(key){
	if(key==116) event.keyCode=27;
	key = event.keyCode;
	if(key==13|| key==27) return false;
}







//*****************************************
//
//マウスロールオーバー時の画像の入れ替え
//	以前は：OnOff
// 使用例：
// onmouseover="mouseOverOut(this,'over');" onmouseout="mouseOverOut(this,'');" 
//****************************************
function mouseOverOut(obj, flg) {
	
	var img_name = obj.src
	if(flg===true || flg==='over') {
		img_name = img_name.replace('_out','_over');
		obj.style.cursor='pointer';
	} else {
		img_name = img_name.replace('_over','_out');
		obj.style.cursor='default';
	}
	obj.src = img_name;
}


//*****************************************
//
//マウスロールオーバー時の画像の入れ替え
// 使用例：
// 
//****************************************
function ChangeImage(obj, replace_image_name_suffix, change_image_name_suffix) {
	var img_name = obj.src
	img_name = img_name.replace(replace_image_name_suffix, change_image_name_suffix);
	obj.src = img_name;
}



//*****************************************
//
//左メニューで使うJavaScript
//
//****************************************


// メニュー･ロールオーバー
function rollOver(obj, val, id) {
	obj.className = val;
	//コントロールのマウスカーソルをポインタに設定します。
	mouseCursor(id);
}

// URLリンク
function jumpUrl(url, window_open_flg) {
	if (window_open_flg == true) {
		window.open(url,"new");
	} else {
		window.location.href=url;
	} 
}

// 表示モード切替
function displayMode(mode) {
	document.getElementById('submenu').style.display = mode;
}

var clt_x=0;	//マウスオーバーのX座標
var clt_y=0;	//マウスオーバーのY座標
var win_w=0;	//ウィンドウの横幅
var win_h=0;	//縦スクロール位置
var tmp=0;		//一時変数
var buf=0;		//一時変数
var mrg=0;		//一時変数
var w=0;		//サブメニューのX座標
var h=0;		//サブメニューのY座標
var app=0;		//ブラウザの種類



//*******************************************************
//コントロールのマウスカーソルをポインタに設定します。
//*******************************************************
function mouseCursor(id) {
	id = "menu" + id;
	var td = document.getElementById(id);
	td.style.cursor = "pointer";
	//td.style.cursor = (flg==1) ? "pointer" : "default";
}


//printf.js - version 1.1.0
//
//	Copyright (C) 2000-2002	Masanao Izumo <iz@onicos.co.jp>
//
//	This library is free software; you can redistribute it and/or
//	modify it under the terms of the GNU Lesser General Public
//	License as published by the Free Software Foundation; either
//	version 2.1 of the License, or (at your option) any later version.
//
//	This library is distributed in the hope that it will be useful,
//	but WITHOUT ANY WARRANTY; without even the implied warranty of
//	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	See the GNU
//	Lesser General Public License for more details.
//
//	You should have received a copy of the GNU Lesser General Public
//	License along with this library; if not, write to the Free Software
//	Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA	02111-1307	USA
//
//
// SYNOPSIS:
//	 printf("format", ...);
//	 str = sprintf("format", ...);
//
// Chages:
// 2002-02-04	Masanao Izumo <mo@goice.co.jp>
//						 - Fixed bug about sprintf("%%") will return "%%".
//						 - Evaluate undefined "%" argument.	That is:
//									 numerical value ===> 0	(%d, %x, %o, etc)
//									 string value		===> ''	(%s)

// printf(format, ...);
function printf() {
	document.write(va_sprintf(printf.arguments));
}

// str = sprintf(format, ...);
function sprintf() {
	return va_sprintf(sprintf.arguments);
}

function va_sprintf(args) {
	var ch;
	var value;
	var longflag;
	var ljust;
	var len, llen;
	var zpad;
	var p;
	var output;
	var format_index, arg_index;
	var argc, argv;
	var specin;
	var format;

	output = '';
	format_index = 0;
	arg_index = 1;
	argv = args;
	argc = args.length;
	format = args[0];

	while (format_index < format.length) {
		ch = format.substr(format_index++, 1);
		if (ch != '%' || format_index == format.length) {
			output += ch;
		} else {
			// ch == '%'
			ljust = len = zpad = longflag = 0;
			llen = -1;
			p = format_index;
			specin = true;

			while (specin) {
	ch = format.substr(format_index++, 1);
	switch(ch) {
	case '-':
		ljust = 1;
					continue;

	case '0':				 // set zero padding if len not set
		if(len == 0)
			zpad = 1;
		// FALLTHROUGH
	case '1': case '2': case '3':
	case '4': case '5': case '6':
	case '7': case '8': case '9':
		len = len * 10 + parseInt(ch);
		continue;

	case '.':
		llen = len;
		len = 0;
		continue;

	case '*':
		if (arg_index < argc)
			len = parseInt(argv[arg_index++]);
		else
			len = 0;
		if (len < 0) {
			ljust = 1;
			len = -len;
		}
		continue;

	case 'l':
		longflag = 1;
		continue;

	case 'u': case 'U':
		if (arg_index < argc) {
			if (longflag) {
				value = parseInt(argv[arg_index++]);
			} else {
				value = parseInt(argv[arg_index++]);
				value %= 4294967296;
			}
		} else {
			value = 0;
		}
		output += _dopr_fmtnum(value, 10,0, ljust, len, zpad);
		break;

	case 'o': case 'O':
		if (arg_index < argc) {
			if (longflag) {
				value = parseInt(argv[arg_index++]);
			} else {
				value = parseInt(argv[arg_index++]);
				value %= 4294967296;
			}
		} else {
			value = 0;
		}
		output += _dopr_fmtnum(value, 8,0, ljust, len, zpad);
		break;

	case 'd': case 'D':
		if (arg_index < argc) {
			if (longflag) {
				value = parseInt(argv[arg_index++]);
			} else {
				value = parseInt(argv[arg_index++]);
				value %= 4294967296;
			}
		} else {
			value = 0;
		}
		output += _dopr_fmtnum(value, 10,1, ljust, len, zpad);
		break;

	case 'x':
		if (arg_index < argc) {
			if (longflag) {
				value = parseInt(argv[arg_index++]);
			} else {
				value = parseInt(argv[arg_index++]);
				value %= 4294967296;
			}
		} else {
			value = 0;
		}
		output += _dopr_fmtnum(value, 16,0, ljust, len, zpad);
		break;

	case 'X':
		if (arg_index < argc) {
			if (longflag) {
				value = parseInt(argv[arg_index++]);
			} else {
				value = parseInt(argv[arg_index++]);
				value %= 4294967296;
			}
		} else {
			value = 0;
		}
		output += _dopr_fmtnum(value, -16,0, ljust, len, zpad);
		break;

	case 's':
		if (arg_index < argc) {
			value = argv[arg_index++];
			if(value == null)
				value = "(null)";
			else
				value = value + "";	// toString
		} else {
			value = '';
		}
		output += _dopr_fmtstr(value, ljust, len, llen);
		break;

	case 'c':
		if (arg_index < argc) {
			value = parseInt(argv[arg_index++]);
		} else {
			value = 0;
		}
		output += _dopr_fromCharCode(value);
		break;

	case '%':
		output += '%';
		break;

/* Not supported
	case 'f': case 'e': case 'E': case 'g': case 'G':
		if (arg_index < argc) {
			value = argv[arg_index++];
		} else {
			value = 0.0;
		}
		output += _dopr_fmtdouble(format.substr(p, format_index - p), value);
		break;
*/

	default:
		if(p + 1 == format_index) {
			output += '%';
			output += ch;
		}
		else {
			// alert("format error: " + format);
		}
		break;
	}
	specin = false;
			}
		}
	}
	return output;
}

// Private function
function _dopr_fmtnum(value, base, dosign, ljust, len, zpad)
{
	var signvalue = '';
	var uvalue;
	var place = 0;
	var padlen;		// amount to pad
	var caps = 0;
	var convert;
	var output;

	convert = '';
	output = '';

	if(value >= 0)
		uvalue = value;
	else
		uvalue = (value % 4294967296) + 4294967296;

	if (dosign) {
		if (value < 0) {
			signvalue = '-';
			uvalue = -value;
		}
	}

	if (base < 0) {
		caps = 1;
		base = -base;
	}

	if(uvalue == 0) {
		convert = '0';
		place = 1;
	} else {
		while (uvalue) {
			if(caps)
	convert = '0123456789ABCDEF'.substr(uvalue % base, 1) + convert;
			else
	convert = '0123456789abcdef'.substr(uvalue % base, 1) + convert;
			uvalue = parseInt(uvalue / base);
			place++;
		}
	}

	padlen = len - place;
	if (padlen < 0) padlen = 0;
	if (ljust) padlen = -padlen;

	if (zpad && padlen > 0) {
		if(signvalue) {
			output += signvalue;
			--padlen;
			signvalue = 0;
		}

		while (padlen > 0) {
			output += '0';
			--padlen;
		}
	}

	while (padlen > 0) {
		output += ' ';
		--padlen;
	}
	if (signvalue) {
		output += signvalue;
	}

	output += convert;
				
	while(padlen < 0) {
		output += ' ';
		++padlen;
	}
	return output;
}

// Private function
function _dopr_fmtstr(value, ljust, field_len, llen)
{
	var padlen;			// amount to pad
	var slen, truncstr = 0;
	var output = '';

	slen = value.length;

	if (llen != -1) {
		var rlen;

		rlen = field_len;
		if (slen > rlen) {
			truncstr = 1;
			slen = rlen;
		}
		field_len = llen;
	}
	padlen = field_len - slen;
				
	if (padlen < 0)
		padlen = 0;
	if (ljust)
		padlen = -padlen;
	while (padlen > 0) {
		output += ' ';
		--padlen;
	}
	if (truncstr) {
		output += value.substr(0, slen);
	} else {
		output += value;
	}

	while (padlen < 0) {
		output += ' ';
		++padlen;
	}
	return output;
}

// Private function
var _dopr_fromCharCode_chars = null;
function _dopr_fromCharCode(code)
{
	if(String.fromCharCode)
		return String.fromCharCode(code);
	if(!_dopr_fromCharCode_chars)
		_dopr_fromCharCode_chars =
			"\000\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020" +
			"\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037 !\"#$%&" +
			"'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghi" +
			"jklmnopqrstuvwxyz{|}~\177\200\201\202\203\204\205\206\207\210\211" +
			"\212\213\214\215\216\217\220\221\222\223\224\225\226\227\230\231\232" +
			"\233\234\235\236\237\240\241\242\243\244\245\246\247\250\251\252\253" +
			"\254\255\256\257\260\261\262\263\264\265\266\267\270\271\272\273\274" +
			"\275\276\277\300\301\302\303\304\305\306\307\310\311\312\313\314\315" +
			"\316\317\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336" +
			"\337\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357" +
			"\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377";
	if(code < 0)
		return "";
	if(code <= 255)
		return _dopr_fromCharCode_chars.substr(code, 1);
	return eval(sprintf("\"\\u%04x\"", code));
}


