//───────────────────────────────────────────
//
//(C) Nihon Computer Graphic Co.,Ltd.
//
//───────────────────────────────────────────

// CMBLPixel.dll JavaScript版
//	移植済みメソッド
//	・pixeltoBL
//	・bltoPixel
//	・centerPosition
//	・gravityPosition
//	・distanceBL
//	・scltoLvZ
//	・lvZtoScl
//	・offsetPosition

var CMBLPixel = {
	Version: '1.0.0',
	
	toScale: function(scaleLevel, mode){
		var scale = 0;
		scaleLevel = scaleLevel.toLowerCase();

		if		(1 == mode){
			if		("1" == scaleLevel)	scale =     250;
			else if	("2" == scaleLevel)	scale =     500;
			else if	("3" == scaleLevel)	scale =    1000;
			else if	("4" == scaleLevel)	scale =    2500;
			else if	("5" == scaleLevel)	scale =    5000;
			else if	("6" == scaleLevel)	scale =   10000;
			else if	("7" == scaleLevel)	scale =   20000;
			else if	("8" == scaleLevel)	scale =  100000;
			else if	("9" == scaleLevel)	scale =  200000;
			else if	("ew"== scaleLevel)	scale =  400000;
			else if	("jp"== scaleLevel)	scale = 2400000;
		}
		else if	(2 == mode){
			if		("1" == scaleLevel)	scale =  100;
			else if	("2" == scaleLevel)	scale =  200;
			else if	("3" == scaleLevel)	scale =  300;
			else if	("4" == scaleLevel)	scale =  500;
			else if	("5" == scaleLevel)	scale =  800;
			else if	("6" == scaleLevel)	scale = 1600;
			else if	("7" == scaleLevel)	scale = 2400;
			else if	("8" == scaleLevel)	scale = 3600;
			else if	("9" == scaleLevel)	scale = 7200;
		}
		else if	(3 == mode){
			scale = parseFloat(scaleLevel);
		}
		return scale;
	},

	pixeltoBL: function(centerblx, centerbly, scale, mode, width, height, pixelx, pixely, blx, bly){
		blx.value = bly.value = "";
		scale = CMBLPixel.toScale(String(scale).toLowerCase(), mode);
		if(0.0 != scale){
			GetPosClick(centerblx, centerbly, scale, width, height, pixelx, pixely, blx, bly);
			blx.value = Math.round(blx.value * 1000.0) / 1000.0;
			bly.value = Math.round(bly.value * 1000.0) / 1000.0;
		}
	},

	bltoPixel: function(centerblx, centerbly, scale, mode, width, height, blx, bly, pixelx, pixely){
		pixelx.value = pixely.value = "";
		scale = CMBLPixel.toScale(String(scale).toLowerCase(), mode);
		if(0.0 != scale){
			GetPosLayer(centerblx, centerbly, scale, width, height, blx, bly, pixelx, pixely);
		}
	},
	
	toSuitableScale: function(scale, mode){
		var scaleLevel = "error";
		if		(1 == mode){
			if		(scale <     250)	scaleLevel = "1";
			else if	(scale <     500)	scaleLevel = "2";
			else if	(scale <    1000)	scaleLevel = "3";
			else if	(scale <    2500)	scaleLevel = "4";
			else if	(scale <    5000)	scaleLevel = "5";
			else if	(scale <   10000)	scaleLevel = "6";
			else if	(scale <   20000)	scaleLevel = "7";
			else if	(scale <  100000)	scaleLevel = "8";
			else if	(scale <  200000)	scaleLevel = "9";
			else if	(scale <  400000)	scaleLevel = "ew";
			else if	(scale < 2400000)	scaleLevel = "jp";
		}
		else if	(2 == mode){
			if		(scale <  100)	scaleLevel = "1";
			else if	(scale <  200)	scaleLevel = "2";
			else if	(scale <  300)	scaleLevel = "3";
			else if	(scale <  500)	scaleLevel = "4";
			else if	(scale <  800)	scaleLevel = "5";
			else if	(scale < 1600)	scaleLevel = "6";
			else if	(scale < 2400)	scaleLevel = "7";
			else if	(scale < 3600)	scaleLevel = "8";
			else if	(scale < 7200)	scaleLevel = "9";
		}
		else if	(3 == mode){
			scaleLevel = String(parseInt(scale));
		}
		return scaleLevel;
	},
	
	countChar: function(buffer, term){
		var len = buffer.length;
		var countExist = 0;
		for(var a = 0; a <= len - 1; a++){
			if(buffer.charAt(a) == term)	countExist++;
		}
		return countExist;
	},

	distanceBLF: function(x1, y1, x2, y2){
		var ctrX, ctrY;
		ctrX = (x1 + x2) / 2.0;			//経度中点
		ctrY = (y1 + y2) / 2.0;			//緯度中点

		var diffBLX, diffBLY;
		diffBLX = Math.abs(x1 - x2);	//経度差
		diffBLY = Math.abs(y1 - y2);	//緯度差

		var YPX = new refvar();
		var MPBX = new refvar();
		var MPBY;
		GetBLInfo(ctrX, ctrY, YPX, MPBX);
		MPBY = YPX.value * MPBX.value;	//緯度MPB

		var diffX, diffY;
		diffX = diffBLX * MPBX.value;	//経度差[m]
		diffY = diffBLY * MPBY;			//緯度差[m]

		var distance = Math.sqrt( (diffX * diffX) + (diffY * diffY) );

		return distance;
	},

	gravityPositionF: function(blx, bly, blcount, crdX, crdY){
		var lv;

		if(blcount < 2){
			lv = "0";
			crdX.value = crdY.value = 0.0;
		}
		else{
			var maxX, maxY, minX, minY;	//経度経度最大、最小
			var ttlX, ttlY;				//経度緯度total
			maxX = minX = blx[0];
			maxY = minY = bly[0];
			ttlX = ttlY = 0.0;
			for(var n = 0; n <= blcount - 1; n++){
				ttlX += blx[n];
				ttlY += bly[n];
				maxX = Math.max(maxX, blx[n]);
				maxY = Math.max(maxY, bly[n]);
				minX = Math.min(minX, blx[n]);
				minY = Math.min(minY, bly[n]);
			}
			crdX.value = ttlX / blcount;
			crdY.value = ttlY / blcount;

			var diffBLX, diffBLY, diffX, diffY, maxScale;
			diffBLX = Math.max( (maxX - crdX.value), (crdX.value - minX) );										//中心と中心から最遠経点との経度差
			diffBLY = Math.max( (maxY - crdY.value), (crdY.value - minY) );										//中心と中心から最遠緯点との緯度差
			if( ( (maxX - crdX.value) - (crdX.value - minX) ) < 0 )	diffBLX = -diffBLX;							//負の場合、最遠経点は中心より左（最小経度）
			if( ( (maxY - crdY.value) - (crdY.value - minY) ) < 0 )	diffBLY = -diffBLY;							//負の場合、最遠緯点は中心より下（最小緯度）
			diffX = CMBLPixel.distanceBLF(crdX.value, crdY.value, crdX.value + diffBLX,	crdY.value + 0);		//経度差の距離[m]
			diffY = CMBLPixel.distanceBLF(crdX.value, crdY.value, crdX.value + 0,		crdY.value + diffBLY);	//緯度差の距離[m]
			maxScale = Math.max(diffX, diffY) * 2.0;															//複数地点を包括する最大スケール

			lv = CMBLPixel.fig2(maxScale);
		}
		return lv;
	},

	centerPositionF: function(blx, bly, blcount, crdX, crdY){
		var lv;

		if(blcount < 2){
			lv = "0";
			crdX.value = crdY.value = 0.0;
		}
		else{
			var maxX, maxY, minX, minY;	//経度経度最大、最小
			maxX = minX = blx[0];
			maxY = minY = bly[0];
			for(var n = 0; n <= blcount - 1; n++){
				maxX = Math.max(maxX, blx[n]);
				maxY = Math.max(maxY, bly[n]);
				minX = Math.min(minX, blx[n]);
				minY = Math.min(minY, bly[n]);
			}
			crdX.value = (maxX + minX) / 2.0;
			crdY.value = (maxY + minY) / 2.0;

			var diffBLX, diffBLY, diffX, diffY, maxScale;
			diffBLX = Math.max( (maxX - crdX.value), (crdX.value - minX) );										//中心と中心から最遠経点との経度差
			diffBLY = Math.max( (maxY - crdY.value), (crdY.value - minY) );										//中心と中心から最遠緯点との緯度差
			if( ( (maxX - crdX.value) - (crdX.value - minX) ) < 0 )	diffBLX = -diffBLX;							//負の場合、最遠経点は中心より左（最小経度）
			if( ( (maxY - crdY.value) - (crdY.value - minY) ) < 0 )	diffBLY = -diffBLY;							//負の場合、最遠緯点は中心より下（最小緯度）
			diffX = CMBLPixel.distanceBLF(crdX.value, crdY.value, crdX.value + diffBLX,	crdY.value + 0);		//経度差の距離[m]
			diffY = CMBLPixel.distanceBLF(crdX.value, crdY.value, crdX.value + 0,		crdY.value + diffBLY);	//緯度差の距離[m]
			maxScale = Math.max(diffX, diffY) * 2.0;															//複数地点を包括する最大スケール

			lv = CMBLPixel.fig2(maxScale);
		}
		return lv;
	},

	fig2: function(scale){
		var maxScale = Math.round(scale);
		var maxScaleLen = String(maxScale).length;
		var maxScalePow = (1 < maxScaleLen) ? Math.pow(10, maxScaleLen - 2) : 1;
		return String(parseInt(maxScale / maxScalePow) * maxScalePow + maxScalePow);
	},

	centerPosition: function(blx, bly, blcount, mode, centerblx, centerbly, lv){
		centerblx.value = centerbly.value = lv.value = "";

		var arrayX, arrayY;
	 	arrayX = String(blx);
	 	arrayX = arrayX.replace("　", "");
	 	arrayX = arrayX.replace(" ", "");
	 	arrayY = String(bly);
	 	arrayY = arrayY.replace("　", "");
	 	arrayY = arrayY.replace(" ", "");

		var countX, countY, countReal;
		countX = CMBLPixel.countChar(arrayX, ',') + 1;
		countY = CMBLPixel.countChar(arrayY, ',') + 1;
		countReal = Math.min(countX, countY);
		if(countReal < 2 || countReal != blcount){
			return;
		}
		else{
			var blaX, blaY;
			blaX = new Array();
			blaY = new Array();

			var tempX, tempY, buffer;
			tempX = arrayX.split(",");
			tempY = arrayY.split(",");
			var blaX = new Array(countReal);
			var blaY = new Array(countReal);
			for(var n = 0; n <= countReal - 1; n++){
				blaX[n] = parseFloat(tempX[n]);
				blaY[n] = parseFloat(tempY[n]);
			}
			var tempLv;
			var crdX = new refvar();
			var crdY = new refvar();
			tempLv = CMBLPixel.centerPositionF(blaX, blaY, countReal, crdX, crdY);
			buffer = CMBLPixel.toSuitableScale(parseInt(tempLv), mode);
			if( "error" == buffer ){
				return;
			}
			else{
				centerblx.value = Math.round(crdX.value * 1000.0) / 1000.0;
				centerbly.value = Math.round(crdY.value * 1000.0) / 1000.0;
				lv.value = buffer;
			}
		}
	},

	gravityPosition: function(blx, bly, blcount, mode, gravityblx, gravitybly, lv){
		gravityblx.value = gravitybly.value = lv.value = "";

		var arrayX, arrayY;
	 	arrayX = String(blx);
	 	arrayX = arrayX.replace("　", "");
	 	arrayX = arrayX.replace(" ", "");
	 	arrayY = String(bly);
	 	arrayY = arrayY.replace("　", "");
	 	arrayY = arrayY.replace(" ", "");

		var countX, countY, countReal;
		countX = CMBLPixel.countChar(arrayX, ',') + 1;
		countY = CMBLPixel.countChar(arrayY, ',') + 1;
		countReal = Math.min(countX, countY);
		if(countReal < 2 || countReal != blcount){
			return;
		}
		else{
			var blaX, blaY;
			blaX = new Array();
			blaY = new Array();

			var tempX, tempY, buffer;
			tempX = arrayX.split(",");
			tempY = arrayY.split(",");
			var blaX = new Array(countReal);
			var blaY = new Array(countReal);
			for(var n = 0; n <= countReal - 1; n++){
				blaX[n] = parseFloat(tempX[n]);
				blaY[n] = parseFloat(tempY[n]);
			}
			var tempLv;
			var crdX = new refvar();
			var crdY = new refvar();
			tempLv = CMBLPixel.gravityPositionF(blaX, blaY, countReal, crdX, crdY);
			buffer = CMBLPixel.toSuitableScale(parseInt(tempLv), mode);
			if( "error" == buffer ){
				return;
			}
			else{
				gravityblx.value = Math.round(crdX.value * 1000.0) / 1000.0;
				gravitybly.value = Math.round(crdY.value * 1000.0) / 1000.0;
				lv.value = buffer;
			}
		}
	},
	
	distanceBL: function(x1, y1, x2, y2){
		var distance = CMBLPixel.distanceBLF(x1, y1, x2, y2);
		return distance;
	},
	
	scltoLvZ: function(scale, mode){
		var crdScl = "";
		var buffer;

		buffer = CMBLPixel.toSuitableScale(parseInt(scale), mode);
		if( "error" == buffer ){
			crdScl = "ob";
		}
		else if( 3 == mode ){
			crdScl = CMBLPixel.fig2( parseFloat(buffer) );
		}
		else{
			crdScl = buffer;
		}
		return crdScl;
	},

	lvZtoScl: function(scale, mode){
		var crdScl;

		scale = CMBLPixel.toScale(String(scale).toLowerCase(), mode);
		if(0.0 == scale){
			crdScl = "error";
		}
		else if( 3 == mode ){
			crdScl = CMBLPixel.fig2( parseFloat(scale) );
		}
		else{
			crdScl = Math.round( scale );
		}
		return crdScl;
	},

	offsetPositionF: function(centerblx, centerbly, distance, direction, div, blx, bly){
		if(div < 1){
			blx.value = bly.value = 0.0;
			return;
		}

		var moveX, moveY;	//移動幅[m]
		if(direction < 1 || 9 < direction)	direction = 5;

		if(direction == 1 || direction == 3 || direction == 7 || direction == 9){	//斜めは(1/√2)倍
			distance /= Math.sqrt(2.0);
		}
		var tempDist;		//分割移動距離[m]
		tempDist = distance / div;

		for(var n = 1; n <= div; n++){
			moveX = moveY = tempDist;
			if(direction == 1 || direction == 4 || direction == 7){	//経度負
					moveX = -moveX;
			}
			if(direction == 2 || direction == 5 || direction == 8){	//経度０
					moveX = 0.0;
			}
			if(direction == 1 || direction == 2 || direction == 3){	//緯度負
					moveY = -moveY;
			}
			if(direction == 4 || direction == 5 || direction == 6){	//経度０
					moveY = 0.0;
			}

			var YPX = new refvar();
			var MPBX = new refvar();
			var MPBY;
			GetBLInfo(centerblx, centerbly, YPX, MPBX);
			MPBY = YPX.value * MPBX.value;		//緯度MPB

			var moveBLX, moveBLY;
			moveBLX = moveX / MPBX.value;		//経度移動量BL
			moveBLY = moveY / MPBY;				//緯度移動量BL

			blx.value = centerblx = centerblx + moveBLX;
			bly.value = centerbly = centerbly + moveBLY;
		}
	},

	offsetPosition: function(centerblx, centerbly, distance, direction, blx, bly){
		blx.value = bly.value = "";

		var div;
		var temp;
		for(var n = 0; n <= 6; n++){
			div = Math.pow(2.0, parseFloat(n));
			temp = div * 10000.0;
			if(distance < temp)	break;
		}

		CMBLPixel.offsetPositionF(centerblx, centerbly, distance, direction, div, blx, bly);
		blx.value = Math.round(blx.value * 1000.0) / 1000.0;
		bly.value = Math.round(bly.value * 1000.0) / 1000.0;
	}
}
