
// #### 一般関数 ####
// 1/0の配列を受け取って、16進文字列に直す(MSBから4桁区切り)
function hex_encode(arg) {
	var d2x = new Array(0,1,2,3,4,5,6,7,8,9,'A','B','C','D','E','F');
	var ret = new Array();
	while(arg.length) {
		var val = 0;
		var a8 = arg.shift();
		var a4 = arg.shift();
		var a2 = arg.shift();
		var a1 = arg.shift();
		if (a8 != undefined && a8 == 1) {	val += 8;	}
		if (a4 != undefined && a4 == 1) {	val += 4;	}
		if (a2 != undefined && a2 == 1) {	val += 2;	}
		if (a1 != undefined && a1 == 1) {	val += 1;	}
		ret.push(d2x[val]);
	}
	return ret.join('');
}
// 16進文字列を受け取って、1/0の配列に直す
function hex_decode(arg) {
	var tmp = arg.split('');
	var x2d = new Array();
	x2d['0'] = ',,,'  ;	x2d['1'] = ',,,1'  ;	x2d['2'] = ',,1,'  ;	x2d['3'] = ',,1,1';
	x2d['4'] = ',1,,' ;	x2d['5'] = ',1,,1' ;	x2d['6'] = ',1,1,' ;	x2d['7'] = ',1,1,1';
	x2d['8'] = '1,,,' ;	x2d['9'] = '1,,,1' ;	x2d['A'] = '1,,1,' ;	x2d['B'] = '1,,1,1';
	x2d['C'] = '1,1,,';	x2d['D'] = '1,1,,1';	x2d['E'] = '1,1,1,';	x2d['F'] = '1,1,1,1';
	var ret = new Array();
	for (var i = 0; i < tmp.length; i++) {
		ret = ret.concat(x2d[tmp[i]].split(','));
	}
	return ret;
}

// 引数をデコード
function arg_array(arg_string) {
	var ARGV = new Array();
	ARGV[0] = document.location.href;
	if (arg_string == undefined) {
		arg_string = document.location.href;
	}
	{
		var arg = "";
//		if (arg_string == undefined) {
//			var loc = new String(document.location);
//			var loci = loc.indexOf('?');
//			if (loci > 0) {
//				ARGV[0] = loc.substring(0, loci);
//				arg = loc.substring(loci + 1, loc.length);
//			}
//		} else {
			arg = arg_string.substring(arg_string.lastIndexOf('?')+1, arg_string.length);
//		}
		if (arg.split('&').length > 1) {
			ARGV = ARGV.concat(arg.split('&'));
		} else {
			ARGV = ARGV.concat(arg.split(';'));
		}
	}
	
	var ARG = new Array();
	var i;
	for (i = 1; i < ARGV.length; i++) {
		var tmp = ARGV[i].split('=');
		ARG[unescape(tmp[0])] = unescape(tmp[1]);
	}
	return ARG;
}

// 要素を取得
function element(id) {
	return document.getElementById(id);
}

// block要素の表示(1)・非表示(0)・トグル(-1)
function element_visible(id, flag) {
	var style = document.getElementById(id).style;
	if (flag < 0) {	// トグル
		var show = 0;
		if (style.display == "none") {
			show = 1;
		}
		element_visible(id, show);
	} else if (flag == 0) {	// 非表示
		style.display = "none";
	} else {	// 表示
		style.display = "block";
	}
}

// select要素の選択を取得/設定
function select_value(id, arg) {
	var obj = document.getElementById(id);
	if (arg == undefined) {
		if (obj.selectedIndex < 0) {
			return "";
		} else {
			return obj.options[obj.selectedIndex].value
		}
	} else {
		for (var i = 0; i < obj.options.length; i++) {
			if (obj.options[i].value == arg) {
				obj.options[i].selected = "selected";
				break;
			}
		}
		return "";
	}
}

// input要素(type="radio")の選択を取得/設定
function radio_value(name, val) {
	var a = document.getElementsByName(name);
	var ret = undefined;
	if (val == undefined) {
		for (var i = 0; i < a.length; i++) {
			if (a[i].checked) {
				ret = a[i].value;
				break;
			}
		}
	} else {
		ret = val;
		for (var i = 0; i < a.length; i++) {
			if (val == a[i].value) {
				a[i].checked = "checked";
			} else {
				a[i].checked = "";
			}
		}
	}
	return ret;
}

// input要素(type="check")の選択状態を取得/設定 
// checked: 1, unchecked: 0, toggle: -1 
function checkbox_value(id, val) {
	var obj = document.getElementById(id);
	if (val != undefined) {
		if (val < 0) {
			obj.checked = (obj.checked? "" : "checked");
		} else if (val > 0) {
			obj.checked = "checked";
		} else {
			obj.checked = "";
		}
	}
	return (obj.checked? 1 : 0);
}


function html_escape(val) {
	return val.replace(/&/g, '&amp;').replace(/"/g, '&quot;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
}
function html_unescape(val) {
	return val.replace(/&gt;/g, '>').replace(/&lt;/g, '<').replace(/&quot;/g, '"').replace(/&amp;/g, '&');
}




// Cookieを扱うオブジェクト
function cookie_object() {
	// .value[key];	// 値リスト 
	// .reload();	// 再読み込み 
	// .get(key);	// 取得 
	// .set(key, value);	// 値の設定 
	// .set(key);	// 削除 

	this.available = 0;
	// 連想配列
	this.value = new Array();
	// 再読み込み 
	this.reload = function() {
		this.value = new Array();
		var cookie_item_array = (document.cookie).split('; ');
		var i = 0;
		for (i = 0; i < cookie_item_array.length; i++) {
			var key_value_array = cookie_item_array[i].split('=');
			this.value[key_value_array[0]] = unescape(key_value_array[1]);
		}
	};
	// 取得
	this.get = function(key) {
		return this.value[key];
	};
	// 設定とクリア
	this.set = function(key, value) {
		if (value == undefined) {
			// クリア
			if (this.value[key] != undefined) {
				document.cookie = key + '=0; expires=Mon, 1-Jan-2001 00:00:00;';
				this.value[key] = undefined;
			}
			return "";
		} else {
			// 設定
			this.value[key] = value;
			var str = key + "=" + escape(this.value[key]) + "; ";
				str += 'expires=Fri, 31-Dec-2030 23:59:59; ';
			document.cookie = str;
			return str;
		}
	};
	this.reload();
	this.set("userdata_available", "true");
	if (this.get("userdata_available") == undefined) {
		return undefined;
	}
	this.available = 1;
	return this;
}

function userdata_object(id) {
	// .key;		// キー "cookie" 
	// .id; 		// HTML要素
	// .reload();	// 再読み込み 
	// .get(key);	// 取得 
	// .set(key, value);	// 値の設定 
	// .set(key);	// 削除 

	this.available = 0;
	// userData のキー 
	this.key = "cookie";
	// ID:関連付けるHTML要素 
	if (id != undefined) {
		this.id = id;
	} else {
		this.id = "cookie";
	}
	this.elem = document.getElementById(this.id);
	if (this.elem == undefined) {
		return undefined;
	}
	if (!this.elem.behaviorUrns) {
		return undefined;
	} else {
		// behavior:url(#default#userData) 
		this.elem.style.behavior = "url(#default#userData)";
	}

	// 再読み込み 
	this.reload = function() {
		this.elem.load(this.key);
	}
	// 取得
	this.get = function(key) {
		key = key.replace(/:/g, "_");
		if (this.elem.getAttribute(key) != null) {
			return this.elem.getAttribute(key);
		} else {
			return undefined;
		}
	};
	// 設定とクリア
	this.set = function(key, value) {
		key = key.replace(/:/g, "_");
		if (value == undefined) {
			// クリア
			this.elem.removeAttribute(key);
		} else {
			// 設定
			this.elem.expires = "Fri, 31 Dec 2030 23:59:59 UTC";
			this.elem.setAttribute(key, value);
		}
		this.elem.save(this.key);
		if (value == undefined) {
			return "";
		} else {
			return value;
		}
	};
	// 初期化 
	this.reload();
	this.set("userdata_available", "true");
	if (this.get("userdata_available") == undefined) {
		return undefined;
	}
	this.available = 1;
	return this;
}





