//───────────────────────────────────────────
//
//(C) Nihon Computer Graphic Co.,Ltd.
//
//───────────────────────────────────────────


//----------------------------------------------------------------------------
function refvar()
{
	this.value = 0.0;
}
//----------------------------------------------------------------------------
function ReturnRamda(Keido){
	if(126 > Keido) return 2.14675498;
	if(126 <= Keido && 132 > Keido) return 2.25147474;
	if(132 <= Keido && 138 > Keido) return 2.35619449;
	if(138 <= Keido && 144 > Keido) return 2.46091425;
	if(144 <= Keido && 150 > Keido) return 2.56563400;
	if(150 <= Keido) return 2.67035376;
	return -1;
}
//----------------------------------------------------------------------------
function BL_UTM(ramda, ido, kdo, e, n){
	var AL = kdo - ramda;
	var SB = Math.sin(ido);
	var CB = Math.cos(ido);
	
	var TB = SB / CB;
	TB = TB * TB;

	var AC = AL * CB;
	var AC2 = AC * AC;
	
	var A = 6377397.155 / Math.sqrt(1.0 - SB * SB * 0.006674372231315);
	var Y1 = CB * CB * 0.006719218798677;
	var X0  =                        ido  * 1.005037306048555
		- 1.0 / 2.0 * Math.sin( 2.0 * ido) * 0.0050478492403
		+ 1.0 / 4.0 * Math.sin( 4.0 * ido) * 0.0000105637868331
		- 1.0 / 6.0 * Math.sin( 6.0 * ido) * 0.000000020633322
		+ 1.0 / 8.0 * Math.sin( 8.0 * ido) * 0.000000000038853
		- 1.0 /10.0 * Math.sin(10.0 * ido) * 0.00000000000007;
		X0 = X0 * 6377397.155 * (1.0 - 0.006674372231315);
	
	var X = (61.0 - 58.0*TB + TB*TB + 270.0*Y1 - 330.0*TB*Y1) * AC2/30.0 + 5.0 - TB + 4.0*Y1*Y1 + 9.0*Y1;
		X = ((X*AC2/12.0 + 1.0) * A*SB*AL*AC*0.5 + X0) * 0.9996;
	var Y = (5.0 - 18.0*TB + TB*TB + 14.0*Y1 - 58.0*TB*Y1) * AC2*0.05 + 1.0 - TB + Y1;
		Y = (Y*AC2/6.0 + 1.0) * A*AC*0.9996 + 500000.0;

	e.value = Y;
	n.value = X;
}
//----------------------------------------------------------------------------
function BYO2UTM(UTMx, UTMy, /* refvar */ Mx, /* refvar */ My)
{
	var Kdo = UTMx / 3600.0;
	var Ido = UTMy / 3600.0;
	var ramda = ReturnRamda(Kdo);
	if (-1 == ramda) return false;

	Ido *= 0.017453292519943;
	Kdo *= 0.017453292519943;

	BL_UTM(ramda, Ido, Kdo, Mx, My);
	return true;
}
//----------------------------------------------------------------------------
function GetBLInfo(X, Y, /* refvar */ dYpX, /* refvar */ dMPB){
	var Ax = 450.0;
	var Ay = 300.0;
	var Pt1x = X;
	var Pt1y = Y;
	var Pt2x = Pt1x + Ax;
	var Pt2y = Pt1y;
	var Rp1x = new refvar();
	var Rp1y = new refvar();
	var Rp2x = new refvar();
	var Rp2y = new refvar();
	if(BYO2UTM(Pt1x, Pt1y, Rp1x, Rp1y) && BYO2UTM(Pt2x, Pt2y, Rp2x, Rp2y)){
		if(Rp1x.value > Rp2x.value){
			Pt2x = Pt1x - Ax;
			BYO2UTM(Pt2x, Pt2y, Rp2x, Rp2y);
		}
		var Pt3x = Pt1x;
		var Pt3y = Pt1y + Ay;
		var Pt4x = Pt2x;
		var Pt4y = Pt3y;
		var Rp3x = new refvar();
		var Rp3y = new refvar();
		var Rp4x = new refvar();
		var Rp4y = new refvar();
		BYO2UTM(Pt3x, Pt3y, Rp3x, Rp3y);
		BYO2UTM(Pt4x, Pt3y, Rp4x, Rp4y);

		var XL12 = Math.sqrt(Math.pow(Rp1x.value - Rp2x.value, 2) + Math.pow(Rp1y.value - Rp2y.value, 2));
		var XL34 = Math.sqrt(Math.pow(Rp3x.value - Rp4x.value, 2) + Math.pow(Rp3y.value - Rp4y.value, 2));
		var YL13 = Math.sqrt(Math.pow(Rp1x.value - Rp3x.value, 2) + Math.pow(Rp1y.value - Rp3y.value, 2));
		var YL24 = Math.sqrt(Math.pow(Rp2x.value - Rp4x.value, 2) + Math.pow(Rp2y.value - Rp4y.value, 2));

		var XL = ((XL12 + XL34) / 2.0) / Ax;
		var YL = ((YL13 + YL24) / 2.0) / Ay;
	
		dYpX.value = (YL / XL);
		dMPB.value = XL;
	}
	else{
		dYpX.value = 1.0;
		dMPB.value = 28.0;
	}
	return;
}
//----------------------------------------------------------------------------
function  GetRectClient(
	X, Y, Scl, DispX, DispY, 
	/* refvar */ Xmin, /* refvar */ Ymin, /* refvar */ Xmax, /* refvar */ Ymax
){
	var dYpX = new refvar();
	var dMPB = new refvar();
	GetBLInfo(X, Y, dYpX, dMPB);
	var xLen = Scl / dMPB.value;
	var yLen = Scl / (dMPB.value * dYpX.value);

	yLen *= (DispY / DispX);

	Xmin.value = X - xLen / 2.0;
	Ymin.value = Y - yLen / 2.0;
	Xmax.value = X + xLen / 2.0;
	Ymax.value = Y + yLen / 2.0;
}
//----------------------------------------------------------------------------
function GetPosClick(
	X, Y, Scl, DispX, DispY, ClickX, ClickY,
	/* refvar */ Xpos, /* refvar */ Ypos
){
	var Xmin = new refvar();
	var Ymin = new refvar();
	var Xmax = new refvar();
	var Ymax = new refvar();
	if ( (0 <= ClickX) && (ClickX <= DispX) && (0 <= ClickY) && (ClickY <= DispY) ){
		GetRectClient(X, Y, Scl, DispX, DispY, Xmin, Ymin, Xmax, Ymax);
		Xpos.value = Round3( Xmin.value + (Xmax.value - Xmin.value) * (ClickX / DispX) );
		Ypos.value = Round3( Ymax.value - (Ymax.value - Ymin.value) * (ClickY / DispY) );
	}
	else{
		Xpos.value = X;
		Ypos.value = Y;
	}
}
//----------------------------------------------------------------------------
//GetPosClickから画面内の制限を外したもの
function GetPosOffset(
	X, Y, Scl, DispX, DispY, ClickX, ClickY,
	/* refvar */ Xpos, /* refvar */ Ypos
){
	var Xmin = new refvar();
	var Ymin = new refvar();
	var Xmax = new refvar();
	var Ymax = new refvar();

	GetRectClient(X, Y, Scl, DispX, DispY, Xmin, Ymin, Xmax, Ymax);
	Xpos.value = Round3( Xmin.value + (Xmax.value - Xmin.value) * (ClickX / DispX) );
	Ypos.value = Round3( Ymax.value - (Ymax.value - Ymin.value) * (ClickY / DispY) );
}
//----------------------------------------------------------------------------
function GetPosLayer(
	X, Y, Scl, DispX, DispY, Xpos, Ypos,
	/* refvar */ ClickX, /* refvar */ ClickY
){
	var Xmin = new refvar();
	var Ymin = new refvar();
	var Xmax = new refvar();
	var Ymax = new refvar();
	GetRectClient(X, Y, Scl, DispX, DispY, Xmin, Ymin, Xmax, Ymax);
	ClickX.value = parseInt((Xpos - Xmin.value) / (Xmax.value - Xmin.value) * DispX);
	ClickY.value = parseInt((Ymax.value - Ypos) / (Ymax.value - Ymin.value) * DispY);
}

//----------------------------------------------------------------------------
//丸め処理 20050131
function Round3( value ){
	dTemp = value * 1000;
	return Math.round( dTemp ) / 1000
}
//───────────────────────────────────────────
//
//	ver 1.00
//	ver 2.00
//		Round3 追加
//
//───────────────────────────────────────────
