/*
v1.05
これらのソースは著作権者を主張しません。改造、二次使用、何でも自由です
ソースを改変した場合の著作権は改変者に準じます
http://kis.cside.com/rgt/

動作確認ブラウザ
IE5, NN7, Opera7
*/

// initialize setting _____________________________________
status_max = 130;	//ステータス最大値
radius = 60;	//ステータス最大値の有効半径
radius_bg = 95;	//背景画像半径
diameter_bg = radius_bg * 2;	//背景画像直径
segment = 8;	//ポジション間のセグメント数
segment_unprinting_margin = 2.5;
	//各セグメント間の最低マージン
	//これ以下になるようならそのセグメントは描画しない（見易さ保全

//背景画像パス
bg_url = "./img/status_bg.png";

//各ポジションに使う画像のパス、表示サイズ
point_imgurl = "./img/point.png";
point_imgwidth = 8;
point_imgheight = 8;

//各セグメントに使う画像のパス、表示サイズ
segment_imgurl = "./img/point.png";
segment_imgwidth = 4;
segment_imgheight = 4;

//マウス座標から見たグラフ表示位置
viewmargin_w = -(diameter_bg - 60);	//width
viewmargin_h = -(diameter_bg + 30);	//height

//各ステータス値の表示位置（left, top)
coord_str = new Array(110, 26);
coord_vit = new Array(158, 70);
coord_luk = new Array(157, 139);
coord_int = new Array(110, 164);
coord_dex = new Array(50, 139);
coord_agi = new Array(38, 70);

//フェード表示設定（フェード処理はIEのみ動作）
fade_use = true;	//フェード処理を使うか（true or false)
trans_max = 100;	//不透明度最大値
trans_min = 0;	//不透明度最低値
trans_1fadein = 20;	//フェードイン１処理時の進捗不透明度
trans_1fadeout = 10;	//フェードアウト１処理時の進捗不透明度
//これらは互いに割り切れる必要がある

//ステ−タス値が正常でない場合に表示するエラー文字列
//及び、その表示位置（left, top)
err_string = "ERROR...<br>(status parameter)";
coord_err = new Array(50, 80);

// end of setting
// ________________________________________________________

layerid = 0;
errors = new Array();

browser = navigator.appName;
if (browser == "Microsoft Internet Explorer") {
	browser = "IE";
	if (fade_use == true) {
		trans_cnt = 0;
		trans_now = new Array();
		trans_tid = new Array();
		trans_loop = new Array();
		trans_name = new Array();
		fadeout_flag = new Array();
		fadein_flag = new Array();
	}
}
else if (browser == "Netscape") {
	browser = "NN";
}
else if (navigator.userAgent.search("Opera")!= -1) {
	browser = "Opera";
}

var pi = Math.PI;
var base_cos = Math.abs( radius * Math.cos(150 * pi / 180) );
var base_sin = Math.abs( radius * Math.sin(150 * pi / 180) );

function setposition(id, left, top) {
	var layerObj = document.getElementById(id);
	if (browser == "IE" || browser == "Opera") {
		layerObj.style.pixelLeft = left;
		layerObj.style.pixelTop = top;
	}
	else if (browser == "NN") {
		layerObj.style.left = left + "px";
		layerObj.style.top = top + "px";
	}
}
function viewsegments(layername, id, x, y, seg_x, seg_y) {
	var saveX = x;
	var saveY = y;
	var x_step, y_step;
	for (i=0; i<segment; i++) {
		x += seg_x;
		y += seg_y;
		x_step = Math.abs( saveX - x );
		y_step = Math.abs( saveY - y );
		if (x_step <= segment_unprinting_margin &&
			y_step <= segment_unprinting_margin ) {
			continue;
		}
		if (y_step <= segment_unprinting_margin &&
			x_step <= segment_unprinting_margin ) {
			continue;
		}
		document.write("<div id=" +layername+id+ " class=graph><img src=" +segment_imgurl+ " width=" +segment_imgwidth+ " height=" +segment_imgheight+ "></div>");
		setposition(layername+id, x, y);
		saveX = x;
		saveY = y;
		id++;
	}
	return id;
}
function viewposition(layername, x, y) {
	document.write("<div id=" +layername+ " class=graph><img src=" +point_imgurl+ " width=" +point_imgwidth+ " height=" +point_imgheight+ "></div>");
	setposition(layername, x, y);
}
function viewparm(layername, x, y, val) {
	document.write("<div id=" +layername+ " class=parm><b><font size=1>" +val+ "</font></b></div>");
	setposition(layername, x, y);
}
function status_output(name, str, agi, vit, int_, dex, luk) {
	var seed;
	var st_x, st_y, vit_x, vit_y, luk_x, luk_y,
		int_x, int_y, dex_x, dex_y, agi_x, agi_y;
	var seg_x, seg_y;
	var id, layername;
	
	layername = name + "_bg";
	document.write("<div id=" +layername+ " class=bg>");
	var layerObj = document.getElementById( layername );
	layerObj.style.backgroundImage = 'url('+bg_url+')';
	if (browser == "IE") {
		layerObj.style.pixelWidth = diameter_bg;
		layerObj.style.pixelHeight = diameter_bg;
		if (fade_use == true) {
			trans_name[trans_cnt] = layername;
			trans_now[trans_cnt] = 0;
			trans_tid[trans_cnt] = '';
			trans_loop[trans_cnt] = 0;
			fadeout_flag[trans_cnt] = false;
			fadein_flag[trans_cnt] = false;
			layerObj.style.filter = "alpha(opacity=" +trans_min+ ")";
			trans_cnt++;
		}
	}
	else if (browser == "NN" ||
			browser == "Opera")
	{
		layerObj.style.width = diameter_bg + "px";
		layerObj.style.height = diameter_bg + "px";
	}
	layerObj.style.visibility = "hidden";
	
	// ステータス値が正常でなければ中断
	if (str == "error"
		|| agi == "error"
		|| vit == "error"
		|| int_ == "error"
		|| dex == "error"
		|| luk == "error" ) {
		errors[name] = true;
		error_output(name + "_err");
		
		// _end_of_status_
		document.write("</div>");
		return;
	}
	
	// 各ポジションの座標計算（時計回り）_________________________
	// str
	seed = eval(str); //if (seed > status_max) seed = status_max;
	seed /= status_max;
	st_x = radius_bg;
	st_y = radius_bg - radius * seed;
	
	// vit
	seed = eval(vit); //if (seed > status_max) seed = status_max;
	seed /= status_max;
	vit_x = radius_bg + base_cos;
	vit_y = radius_bg - base_sin;
	vit_x = radius_bg + Math.abs(vit_x - radius_bg) * seed;
	vit_y = radius_bg - Math.abs(vit_y - radius_bg) * seed;
	
	// luk
	seed = eval(luk); //if (seed > status_max) seed = status_max;
	seed /= status_max;
	luk_x = radius_bg + base_cos;
	luk_y = radius_bg + base_sin;
	luk_x = radius_bg + Math.abs(luk_x - radius_bg) * seed;
	luk_y = radius_bg + Math.abs(luk_y - radius_bg) * seed;
	
	// int
	seed = eval(int_); //if (seed > status_max) seed = status_max;
	seed /= status_max;
	int_x = radius_bg;
	int_y = radius_bg + radius * seed;
	
	// dex
	seed = eval(dex); //if (seed > status_max) seed = status_max;
	seed /= status_max;
	dex_x = radius_bg - base_cos;
	dex_y = radius_bg + base_sin;
	dex_x = radius_bg - Math.abs(dex_x - radius_bg) * seed;
	dex_y = radius_bg + Math.abs(dex_y - radius_bg) * seed;
	
	// agi
	seed = eval(agi); //if (seed > status_max) seed = status_max;
	seed /= status_max;
	agi_x = radius_bg - base_cos;
	agi_y = radius_bg - base_sin;
	agi_x = radius_bg - Math.abs(agi_x - radius_bg) * seed;
	agi_y = radius_bg - Math.abs(agi_y - radius_bg) * seed;
	
	// 各ポジション間のセグメントを表示（時計回り）______________________________
	layername = name + "_segments";
	document.write("<div id=" +layername+ " class=segments>");
	id = 0;
	// str -> vit
	seg_x = (vit_x - st_x) / segment;
	seg_y = (vit_y - st_y) / segment;
	id = viewsegments(layername, id, st_x, st_y, seg_x, seg_y);
	
	// vit -> luk
	seg_x = (luk_x - vit_x) / segment;
	seg_y = (luk_y - vit_y) / segment;
	id = viewsegments(layername, id, vit_x, vit_y, seg_x, seg_y);
	
	// luk -> int
	seg_x = (int_x - luk_x) / segment;
	seg_y = (int_y - luk_y) / segment;
	id = viewsegments(layername, id, luk_x, luk_y, seg_x, seg_y);
	
	// int -> dex
	seg_x = (dex_x - int_x) / segment;
	seg_y = (dex_y - int_y) / segment;
	id = viewsegments(layername, id, int_x, int_y, seg_x, seg_y);
	
	// dex -> agi
	seg_x = (agi_x - dex_x) / segment;
	seg_y = (agi_y - dex_y) / segment;
	id = viewsegments(layername, id, dex_x, dex_y, seg_x, seg_y);
	
	// agi -> str
	seg_x = (st_x - agi_x) / segment;
	seg_y = (st_y - agi_y) / segment;
	id = viewsegments(layername, id, agi_x, agi_y, seg_x, seg_y);
	document.write("</div>");
	
	// 各ポジションを表示（時計回り）______________________________
	layername = name + "_positions";
	document.write("<div id="  +layername+ " class=positions>");
	viewposition(layername+0, st_x, st_y);
	viewposition(layername+1, vit_x, vit_y);
	viewposition(layername+2, luk_x, luk_y);
	viewposition(layername+3, int_x, int_y);
	viewposition(layername+4, dex_x, dex_y);
	viewposition(layername+5, agi_x, agi_y);
	document.write("</div>");
	
	// 各ステータス値を表示（時計回り）______________________________
	layername = name + "_status";
	document.write("<div id=" +layername+ " class=status>");
	viewparm(layername+0, coord_str[0], coord_str[1], str);
	viewparm(layername+1, coord_vit[0], coord_vit[1], vit);
	viewparm(layername+2, coord_luk[0], coord_luk[1], luk);
	viewparm(layername+3, coord_int[0], coord_int[1], int_);
	viewparm(layername+4, coord_dex[0], coord_dex[1], dex);
	viewparm(layername+5, coord_agi[0], coord_agi[1], agi);
	document.write("</div>");
	
	layerObj = document.getElementById( layername+4 );
	if (browser == "IE" || browser == "Opera") {
		layerObj.style.pixelLeft -= layerObj.offsetWidth;
	}
	
	layerObj = document.getElementById( layername+5 );
	if (browser == "IE" || browser == "Opera") {
		layerObj.style.pixelLeft -= layerObj.offsetWidth;
	}
	
	// _end_of_status_
	document.write("</div>");
}
function hidden_graph(name) {
 	var layerObj = document.getElementById(name + "_bg");
	if (browser == "IE" &&
		fade_use == true)
	{ 
		for (i=0; i<trans_name.length; i++) {
			if (trans_name[i] == name + "_bg") {
				fadein_flag[i] = false;
				fadeout_flag[i] = true;
				clearTimeout( trans_tid[i]  );
				fadeout_alpha(i);
				break;
			}
		}
	}
	else
	{
		layerObj.style.visibility = "hidden";
		if (errors[name]) {
			document.getElementById(name + "_err").style.visibility = "hidden";
		}else{
			visible_layers(name + "_segments", false);
			visible_layers(name + "_positions", false);
			visible_layers(name + "_status", false);
		}
	}
}
function show_graph(name, x, y) {
 	var layerObj = document.getElementById( name + "_bg" );
 	if (browser == "IE" ||
 		browser == "Opera") {
		layerObj.style.pixelLeft = document.body.scrollLeft + event.clientX + viewmargin_w;
		layerObj.style.pixelTop = document.body.scrollTop + event.clientY + viewmargin_h;
	}
	else if (browser == "NN") {
		layerObj.style.left = x + viewmargin_w + "px";
		layerObj.style.top = y + viewmargin_h + "px";
	}
	
	layerObj.style.visibility = "visible";
	if (errors[name]) {
		document.getElementById(name + "_err").style.visibility = "visible";
	}else{
		visible_layers(name + "_segments", true);
		visible_layers(name + "_positions", true);
		visible_layers(name + "_status", true);
	}
	
	if (browser == "IE" &&
		fade_use == true)
	{
		for (i=0; i<trans_name.length; i++) {
			if (trans_name[i] == name + "_bg") {
				fadeout_flag[i] = false;
				fadein_flag[i] = true;
				clearTimeout( trans_tid[i]  );
				fadein_alpha(i);
				break;
			}
		}
	}
}
function fadein_alpha(arraynum) {
	var layerObj = document.getElementById( trans_name[arraynum] );
	if (trans_now[arraynum] > trans_max ||
		fadein_flag[arraynum] == false)
	{
		clearTimeout( trans_tid[arraynum]  );
		fadein_flag[arraynum] == false;
		return;
	}
	else
	{
		layerObj.style.filter = "alpha(opacity=" + trans_now[arraynum] + ")";
		trans_loop[arraynum] += trans_1fadein;
		trans_now[arraynum] = trans_min + trans_loop[arraynum];
		
		//再帰でフェードさせる
		trans_tid[arraynum] = setTimeout("fadein_alpha(" + arraynum + ")", 100);
	} 
}
function fadeout_alpha(arraynum) {
	var layerObj = document.getElementById( trans_name[arraynum] );
	if (trans_now[arraynum] < trans_min ||
		fadeout_flag[arraynum] == false)
	{
		clearTimeout( trans_tid[arraynum]  );
		fadeout_flag[arraynum] == false;
		return;
	}
	else
	{
		layerObj.style.filter = "alpha(opacity=" + trans_now[arraynum] + ")";
		trans_loop[arraynum] -= trans_1fadeout;
		trans_now[arraynum] = trans_min + trans_loop[arraynum];
		
		//再帰でフェードさせる
		trans_tid[arraynum] = setTimeout("fadeout_alpha(" + arraynum + ")", 100);
	} 
}
function visible_layers(name, flag) {
	var object = document.getElementById(name);
	if (flag == true) {
		for (i=0; i<object.length; i++) object[i].style.visibility = "visible";
	}else{
		for (i=0; i<object.length; i++) object[i].style.visibility = "hidden";
	}
}
function verify_status(parm) {
	if (parm == '') return 1;
	
	var str = parm.match(/\D/g);
	if (str) {
		if (str.length != 1) { return "error"; }
		if (str[0] != '+') { return "error"; }
	}
	
	if (eval(parm) > status_max) { return "error"; }
	
	return parm;
}
function error_output(layername) {
	document.write("<div id=" +layername+ " class=parm><b><font size=1>" +err_string+ "</font></b></div>");
	setposition(layername, coord_err[0], coord_err[1]);
}
