var canvas;
var canvas2;
var ctx;
var cty;
var img;

var CalcDone=false;		//計算完了状態ならtrue  待機中はfalse

var onlyP;	//マッチング線を消すかどうかを決めるグローバル変数
var Srad=110;				//半径
var SmithX=0;				//smithチャートを描画する左上の座標
var SmithY=0;
var Spox=SmithX+Srad+7;		//smithチャートの中心座標
var Spoy=SmithY+Srad+7;
var stateC=0;			//3のとき複数解あり
var selectC=true;				//交点選択用変数
var mcn=1;				//選択されている回路の番号
var LamdaStb;

var minimsl;			//MSLの波長短縮率
var ministb;			//スタブの波長短縮率

//Q値表示用
var	cropL;		//左スミスのマッチング交点
var cropR;		//右スミスのマッチング交点
var DoneQzs=false;
var DoneQzL=false;
var DoneQcross=false;

//その昔branchにあった変数たち
	var freq; 		//周波数
	var Z0; 		//特性インピーダンス
	var Z0stb;		//ストリップラインの特性インピーダンス
	var Z0msl;		//ストリップラインの特性インピーダンス
	
	var zs;			//Zsの読み込み
	var zsk;		//zsの複素共役
	var zL;			//ZLの読み込み
	var zLk;		//zLの複素共役
	var Ys;			//Ys=1/Zsを求める
 	var Ysk;		//Ysk=1/zsk
	var YL;			//YL=1/ZLを求める
	var YLk;		//YLk=1/zLk

	var UVs;		//Zsのチャート上の座標定義
	var UVsk;		//Zskのチャート上の座標定義
	var UVL;		//ZLのチャート上の座標定義
	var UVLk;		//ZLkのチャート上の座標定義

	var RcurvS;		//Zsのレジスタンス円の中心点と半径取得
	var RcurvL;		//ZLのレジスタンス円の中心点と半径取得
	var GcurvS;		//Ysのコンダクタンス円の中心点と半径取得
	var GcurvL;		//YLのコンダクタンス円の中心点と半径取得
	
	var nstb;
	var nmsl;


//Sパラ表示用の変数たち
var graphData;
var dataS21;
var dataS11;
var point=200;
//var fstart=100E6;
var fstart=0;
var fstop=4E9;
var FlatS=40;
var imgR;
var ctr;
var canvasRect;
var boxPosiX=51;
var boxPosiY=0;
var boxX=302;
var boxY=200;

function first() {
	canvas = document.getElementById("canvas");
	if ( ! canvas || ! canvas.getContext ) { return false; }
	ctx = canvas.getContext("2d");
  
	canvas2 = document.getElementById("canvas2");
	if ( ! canvas2 || ! canvas2.getContext ) { return false; }
	cty = canvas2.getContext("2d");
	
	img = new Image();
	img.src="img/smith.jpg?" + new Date().getTime();
	img.onload = function(){ ctx.drawImage(img,SmithX,SmithY); cty.drawImage(img,SmithX,SmithY); }
	
	canvasRect = document.getElementById("rectangular");		//rectangularキャンバスのイニシャライズ
	if ( ! canvasRect || ! canvasRect.getContext ) { return false; }
	ctr = canvasRect.getContext("2d");
	
	imgR = new Image();			//Sパラの背景目盛り
	imgR.src="img/RectBack.jpg?" + new Date().getTime();
	imgR.onload = function(){ ctr.drawImage(imgR,0,0);}

//	changeCircuit(1);		//button.js関数のプリロード　必要？
//	rectS();				//Sパラを表示

	ClearSpara();

	fstart=parseFloat(document.formRect.F0.value)*1E9;		//グラフの周波数始点を取得
	fstop=parseFloat(document.formRect.F4.value)*1E9;		//グラフの周波数終点を取得
	
	getBasicParam();
	paramSub();

	document.form1.rr1.select();	//起動時にRe[zs]を選択状態にする
	
	document.Qcalculator.resultQzs.value="";
	document.Qcalculator.resultQcross.value="";
	document.Qcalculator.resultQzL.value="";
}

function getBasicParam(){
	freq=parseFloat(document.form1.Freq.value)*1E6;		//周波数を取得
	Z0=parseFloat(document.form1.Z0.value);		//特性インピーダンス
	Z0stb=parseFloat(document.formSub.Z0stb.value);		//ストリップラインの特性インピーダンス
	Z0msl=parseFloat(document.formSub.Z0msl.value);		//ストリップラインの特性インピーダンス	
}

function paramCalc(){		//各基本パラメータを計算する関数
	CalcDone=false;			//計算待機状態
	getBasicParam();
	paramSub();
	ClearDoneQ();			//Qカーブをリセット
	
	cropR= new realimg(0,0);
	cropL= new realimg(0,0);
	
	zs=new realimg(parseFloat(document.form1.rr1.value)/Z0 , parseFloat(document.form1.xx1.value)/Z0); //Zsの読み込み
		if(zs.re==0) zs.re=1/1E12;		//zsの値がゼロのとき，1E-9にする
		if(zs.im==0) zs.im=1/1E12;
	zsk=compcon(zs);	//zsの複素共役
	zL=new realimg(parseFloat(document.form1.rr2.value)/Z0 , parseFloat(document.form1.xx2.value)/Z0);  //ZLの読み込み
		if(zL.re==0) zL.re=1/1E12;		//zLの値がゼロのとき，1E-9にする
		if(zL.im==0) zL.im=1/1E12;
	
	zLk=compcon(zL);	//zLの複素共役
	Ys=RXtoGB(zs);		//Ys=1/Zsを求める
 	Ysk=RXtoGB(zsk);	//Ysk=1/zsk
	YL=RXtoGB(zL);		//YL=1/ZLを求める
	YLk=RXtoGB(zLk);	//YLk=1/zLk

	UVs=RXtoUV(zs);		//Zsのチャート上の座標定義
	UVsk=RXtoUV(zsk);	//Zskのチャート上の座標定義
	UVL=RXtoUV(zL);		//ZLのチャート上の座標定義
	UVLk=RXtoUV(zLk);	//ZLkのチャート上の座標定義

	RcurvS = ReToAR(zs.re);		//Zsのレジスタンス円の中心点と半径取得
	RcurvL = ReToAR(zL.re);		//ZLのレジスタンス円の中心点と半径取得
	GcurvS = ReToARG(Ys.re);	  //Ysのコンダクタンス円の中心点と半径取得
	GcurvL = ReToARG(YL.re);	  //YLのコンダクタンス円の中心点と半径取得
	
	nstb = Z0stb/Z0;		//スタブのインピーダンス比
	nmsl = Z0msl/Z0;		//マイクロストリップラインのインピーダンス比

//	if(plot2){
		plotPoint2(UVL,UVsk,false);	//左のスミスチャートにZs'点とZL点のプロット
		plotPoint2(UVs,UVLk,true);	//右のスミスチャートにZs点とZL'点のプロット
//	}

	document.Qcalculator.resultQzs.value=Math.abs(CalcQ(UVs));		//Q表示
	document.Qcalculator.resultQcross.value="";
	document.Qcalculator.resultQzL.value=Math.abs(CalcQ(UVL));

	ctr.clearRect(0, 0, 352, 352);	//グラフ背景いったん消去
	ctr.drawImage(imgR,0,0);		//グラフ描画
}

function paramSub(){
	ministb=CalcLamdaE(true);	//スタブの波長短縮率を求めて表示
	minimsl=CalcLamdaE(false);	//伝送線路の波長短縮率を求めて表示
}

function rectBeforeBranch(){
	if(CalcDone){
		branch();
	}
}

function  branch(){		//回路によって分岐
	ClearDoneQ();		//Qカーブをひいてないことにする
	stateC=0;
	getFss();			//グラフの周波数始点終点を取得
	cropR= new realimg(0,0);
	cropL= new realimg(0,0);
	switch (mcn){
	//	case ?: cir?(freq, スタート側,ゴール側,スタート側の座標,ゴール側の座標,z側R円,y側g円,smith,whichC,byoga)
	
		//Ls - Cp
		case 1: if(cir1(zs, YLk, UVs, UVLk, RcurvS, GcurvL, true ,true ,false))stateC=1;
				if(cir1(zs, YLk, UVs, UVLk, RcurvS, GcurvL, true ,false ,false))stateC=stateC+2;
				if(stateC==1 || stateC==0)		selectC=true;
				else if(stateC==2) 				selectC=false;
				cir1(zs, YLk, UVs, UVLk, RcurvS, GcurvL, true ,selectC ,true);
				cir2(YL, zsk, UVL, UVsk, GcurvL, RcurvS, false ,!selectC ,true);
				break;
				
		//Cp - Ls
		case 2: if(cir2(Ys, zLk, UVs, UVLk, GcurvS, RcurvL, true, true ,false))stateC=1;
				if(cir2(Ys, zLk, UVs, UVLk, GcurvS, RcurvL, true, false ,false))stateC=stateC+2;
				if(stateC==1 || stateC==0)		selectC=true;
				else if(stateC==2) 				selectC=false;
				cir2(Ys, zLk, UVs, UVLk, GcurvS, RcurvL, true ,selectC ,true);
				cir1(zL, Ysk, UVL, UVsk, RcurvL, GcurvS, false ,!selectC ,true);
				break;
				
		//Cs - Cp
		case 3: if(cir3(zs, YLk, UVs, UVLk, RcurvS, GcurvL, true ,true ,false)) stateC=1;	
				if(cir3(zs, YLk, UVs, UVLk, RcurvS, GcurvL, true ,false ,false)) stateC=stateC+2;
				if(stateC==1 || stateC==0)		selectC=true;
				else if(stateC==2) 				selectC=false;
					cir3(zs, YLk, UVs, UVLk, RcurvS, GcurvL, true ,selectC ,true);
					cir4(YL, zsk, UVL, UVsk, GcurvL, RcurvS, false ,!selectC ,true);
				break;
		
		//Cp - Cs
		case 4: if(cir4(Ys, zLk, UVs, UVLk, GcurvS, RcurvL, true ,true ,false)) stateC=1; 
				if(cir4(Ys, zLk, UVs, UVLk, GcurvS, RcurvL, true ,false ,false)) stateC=stateC+2;
				if(stateC==1 || stateC==0)		selectC=true;
				else if(stateC==2) 				selectC=false;
					cir4(Ys, zLk, UVs, UVLk, GcurvS, RcurvL, true ,selectC ,true);
					cir3(zL, Ysk, UVL, UVsk, RcurvL, GcurvS, false ,!selectC ,true);	
				break;
				
		//Cs - Lp			
		case 5: if(cir5(zs, YLk, UVs, UVLk, RcurvS, GcurvL, true ,true, false)) stateC=1;
				if(cir5(zs, YLk, UVs, UVLk, RcurvS, GcurvL, true ,false, false)) stateC=stateC+2;
				if(stateC==1 || stateC==0)		selectC=true;
				else if(stateC==2) 				selectC=false;
				cir5(zs, YLk, UVs, UVLk, RcurvS, GcurvL, true ,selectC ,true);
				cir6(YL, zsk, UVL, UVsk, GcurvL, RcurvS, false ,!selectC ,true);	
				break;
				
		//Lp - Cs	
		case 6: if(cir6(Ys, zLk, UVs, UVLk, GcurvS, RcurvL, true,true,false))stateC=1;
				if(cir6(Ys, zLk, UVs, UVLk, GcurvS, RcurvL, true,false,false))stateC=stateC+2;
				if(stateC==1 || stateC==0)		selectC=true;
				else if(stateC==2) 				selectC=false;
				cir6(Ys, zLk, UVs, UVLk, GcurvS, RcurvL, true ,selectC ,true);
				cir5(zL, Ysk, UVL, UVsk, RcurvL, GcurvS, false ,!selectC ,true);	
				break;
				
		//Ls - Lp				
		case 7: if(cir7(zs, YLk, UVs, UVLk, RcurvS, GcurvL, true,true,false))stateC=1;
				if(cir7(zs, YLk, UVs, UVLk, RcurvS, GcurvL, true,false,false))stateC=stateC+2;
				if(stateC==1 || stateC==0)		selectC=true;
				else if(stateC==2) 				selectC=false;
				cir7(zs, YLk, UVs, UVLk, RcurvS, GcurvL, true ,selectC ,true);
				cir8(YL, zsk, UVL, UVsk, GcurvL, RcurvS, false ,!selectC ,true);	
				break;
				
		//Lp - Ls
		case 8: if(cir8(Ys, zLk, UVs, UVLk, GcurvS, RcurvL, true, true, false)) stateC=1;
				if(cir8(Ys, zLk, UVs, UVLk, GcurvS, RcurvL, true, false, false)) stateC=stateC+2;
				if(stateC==1 || stateC==0)		selectC=true;
				else if(stateC==2) 				selectC=false;
				cir8(Ys, zLk, UVs, UVLk, GcurvS, RcurvL, true ,selectC ,true);
				cir7(zL, Ysk, UVL, UVsk, RcurvL, GcurvS, false ,!selectC ,true);	
				break;
				
		//Line - ShortStub
		case  9:if(cir9(zs, zLk, YLk, UVs ,UVLk ,nstb ,nmsl ,GcurvL ,true, true, false))stateC=1;
				if(cir9(zs, zLk, YLk, UVs ,UVLk ,nstb ,nmsl ,GcurvL ,true, false, false))stateC=stateC+2;
				if(stateC==1 || stateC==0)		selectC=true;
				else if(stateC==2) 				selectC=false;	
				cir9(zs, zLk, YLk, UVs ,UVLk ,nstb ,nmsl ,GcurvL ,true,selectC ,true);
				cir10(zL, YL, zsk, UVL ,UVsk ,nstb ,nmsl ,GcurvL ,false,!selectC ,true);	
				break;	
				
		//ShortStub - Line			
		case 10:if(cir10(zs, Ys, zLk, UVs ,UVLk ,nstb ,nmsl ,GcurvS ,true, true, false))stateC=1;
				if(cir10(zs, Ys, zLk, UVs ,UVLk ,nstb ,nmsl ,GcurvS ,true, false, false))stateC=stateC+2;
				if(stateC==1 || stateC==0)		selectC=true;
				else if(stateC==2) 				selectC=false;				
				cir10(zs, Ys, zLk, UVs ,UVLk ,nstb ,nmsl ,GcurvS ,true,selectC ,true);	
				cir9(zL, zLk, Ysk, UVL ,UVsk ,nstb ,nmsl ,GcurvS ,false,!selectC ,true);	
				break;
				
		//Line - OpenStub		
		case 11:if(cir11(zs, zLk, YLk, UVs ,UVLk ,nstb ,nmsl ,GcurvL ,true, true, false))stateC=1;
				if(cir11(zs, zLk, YLk, UVs ,UVLk ,nstb ,nmsl ,GcurvL ,true, true, false))stateC=stateC+2;
				if(stateC==1 || stateC==0)		selectC=true;
				else if(stateC==2) 				selectC=false;				
				cir11(zs, zLk, YLk, UVs ,UVLk ,nstb ,nmsl ,GcurvL ,true,selectC ,true);	
				cir12(zL, YL, zsk, UVL ,UVsk ,nstb ,nmsl ,GcurvL ,false,!selectC ,true);	
				break;
				 
		//OpenStub - Line		 
		case 12:if(cir12(zs, Ys, zLk, UVs ,UVLk ,nstb ,nmsl ,GcurvS ,true,true,false))stateC=1;
				if(cir12(zs, Ys, zLk, UVs ,UVLk ,nstb ,nmsl ,GcurvS ,true,true,false))stateC=stateC+2;
				if(stateC==1 || stateC==0)		selectC=true;
				else if(stateC==2) 				selectC=false;		
				cir12(zs, Ys, zLk, UVs ,UVLk ,nstb ,nmsl ,GcurvS ,true,selectC ,true);		
				cir11(zL, zLk, Ysk, UVL ,UVsk ,nstb ,nmsl ,GcurvS ,false,!selectC ,true);	
				break;
	}
	document.Qcalculator.resultQzs.value=Math.abs(CalcQ(UVs));
	document.Qcalculator.resultQzL.value=Math.abs(CalcQ(UVL));
	highlightButton(21); //別の解ボタンを非表示させるかも
	rectS();				//Sパラを表示
	CalcDone=true;			//計算完了状態
}

function otherCross(){
	if(stateC==3){
		selectC=!selectC;
		branch();
	}
}

function getFss(){		//グラフの周波数始点終点を取得してくれる関数
	var fsub;	//周波数の差分
	var freqF1;
	var freqF2;
	var freqF3;
	
	fstart=parseFloat(document.formRect.F0.value)*1E9;		//グラフの周波数始点を取得
	fstop=parseFloat(document.formRect.F4.value)*1E9;		//グラフの周波数終点を取得
	fsub=(fstop-fstart)/4
	
	freqF1=round1((fstart+fsub)/1E9);
	freqF2=round1((fstart+fsub*2)/1E9);
	freqF3=round1((fstart+fsub*3)/1E9);

	document.formRect.F0.value=addP0(fstart/1E9)		//値が整数のとき、.0を付加
	document.formRect.F4.value=addP0(fstop/1E9)
	
	if(document.getElementById){
		var objF1=document.getElementById("F1");
		var objF2=document.getElementById("F2");
		var objF3=document.getElementById("F3");
		objF1.innerHTML=addP0(freqF1);		//値が整数のとき、.0を付加しながら表示
		objF2.innerHTML=addP0(freqF2);
		objF3.innerHTML=addP0(freqF3);
	}
}

function addP0(freqText){		//値が整数のときに、.0を付加して返す
	if (freqText % 1 == 0) freqText += ".0";
	return freqText;
}

function rectS(){			//Sパラの方形グラフを表示する関数
	var LineCut=false;		//途中でFlatS dBを下回ったときにラインをカットするための二値　trueのときカット状態　

	ctr.clearRect(0, 0, 352, 352);	//背景いったん消去
	ctr.drawImage(imgR,0,0);		//グラフ描画

	var offset=10;		//0dBの位置調整
	var bias=(boxY-offset)/FlatS;		//グラフの下辺をFlatS dBに設定する
	
	if(fstart>fstop) ClearSpara();			//始点>終点のときSパラをクリアして表示させない
	
	//S11を描く部分
	ctr.lineWidth = 1.2;
	ctr.strokeStyle = 'rgba(150, 0, 0, 1)';	
	ctr.beginPath();
	ctr.moveTo(boxPosiX, boxPosiY+offset-dataS11[0]*bias);		//IE対策
	for(cnt=0; cnt <= point; cnt++){
//		if(dataS11[cnt] < -FlatS){		//グラフがFlatSを下回ったとき			だめだ
//			ctr.stroke();
//			LineCut=true;
//		}else if(dataS11[cnt] >= FlatS && LineCut){		//グラフがFlatS以下から上ってきたとき
//			LineCut=false;
//			ctr.beginPath();
//			ctr.lineTo(boxPosiX+(boxX)*cnt/point, boxPosiY+offset-dataS11[cnt]*bias);	//プロットをつなぎ合わせる部分
//		}else if(dataS11[cnt] >= FlatS && LineCut){	//通常状態
//		}else{

			ctr.lineTo(boxPosiX+(boxX)*cnt/point, boxPosiY+offset-dataS11[cnt]*bias);	//プロットをつなぎ合わせる部分			
//		}
	}	
	ctr.stroke();

	//S21を描く部分
	ctr.strokeStyle = 'rgba(0, 80, 0, 1)';	
	ctr.beginPath();
	ctr.moveTo(boxPosiX, boxPosiY+offset-dataS21[0]*bias);		//IE対策
	for(cnt=0; cnt <= point; cnt++){
		ctr.lineTo(boxPosiX+(boxX)*cnt/point, boxPosiY+offset-dataS21[cnt]*bias);	//プロットをつなぎ合わせる部分
	}
	ctr.stroke();
}

//集中定数で、zs 直列素子 並列素子 zLの場合のSparaを求める
function CalcSpara1(Ps,Pp,cnumber){
	var z0s=zs.re*Z0;
	var xs=zs.im*Z0;
	var z0L=zL.re*Z0;
	var xL=zL.im*Z0;

	var x1;
	var x2;
	var mother;
	var fsweep;
	var cnt;
	var objTextarea = document.getElementsByName('tarea')[0]; 
	dataS21 = new Array(point);
	dataS11 = new Array(point);

	for(cnt=0; cnt<=point; cnt++){
		fsweep=fstart+cnt*(fstop-fstart)/point;
		if(fsweep==0)fsweep=1/1E3;
		switch(cnumber){
			case 1 : x1=2*Math.PI*fsweep*Ps;
					 x2=-1/(2*Math.PI*fsweep*Pp);
					 break; //Ls-Cp
			case 3 : x1=-1/(2*Math.PI*fsweep*Ps);
					 x2=-1/(2*Math.PI*fsweep*Pp);
					 break; //Cs-Cp
			case 5 : x1=-1/(2*Math.PI*fsweep*Ps);
					 x2=2*Math.PI*fsweep*Pp;
					 break; //Cs-Lp
			case 7 : x1=2*Math.PI*fsweep*Ps;
					 x2=2*Math.PI*fsweep*Pp;
					 break;//Ls-Lp
		}

		mother=Math.sqrt( pow2((x2+xL)*z0s+(x1+x2+xs)*z0L)+pow2(x1*(x2+xL)+xL*xs+x2*(xL+xs)-z0s*z0L));
		dataS21[cnt]=20*Math.log(Math.abs(2*x2*Math.sqrt(z0s*z0L)/mother))/Math.LN10;
		dataS11[cnt]=20*Math.log(Math.abs(Math.sqrt( pow2((x2+xL)*z0s-(x1+x2+xs)*z0L)+pow2(x1*(x2+xL)+xL*xs+x2*(xL+xs)+z0s*z0L))/mother))/Math.LN10;

		if(dataS21[cnt] < -FlatS)	dataS21[cnt]=-FlatS;		//小さすぎたらフラットにする
		if(dataS11[cnt] < -FlatS)	dataS11[cnt]=-FlatS;
	
	}
	
	var MBWdone=0;
	var calcLeft=1;
	var MBW=0;
	var S21MBW;
	var nomal=freq/1000;
	var MBWdB=-parseFloat(document.rectMBW.MBWdB.value)
	var cntMBW=0;
	fsweep=freq;
	while(!MBWdone){
		if(calcLeft){
			fsweep=fsweep-nomal;
			cntMBW++;
		}else{
			fsweep=fsweep+nomal;
			cntMBW++;
		}
		
		switch(cnumber){
			case 1 : x1=2*Math.PI*fsweep*Ps;
					 x2=-1/(2*Math.PI*fsweep*Pp);
					 break; //Ls-Cp
			case 3 : x1=-1/(2*Math.PI*fsweep*Ps);
					 x2=-1/(2*Math.PI*fsweep*Pp);
					 break; //Cs-Cp
			case 5 : x1=-1/(2*Math.PI*fsweep*Ps);
					 x2=2*Math.PI*fsweep*Pp;
					 break; //Cs-Lp
			case 7 : x1=2*Math.PI*fsweep*Ps;
					 x2=2*Math.PI*fsweep*Pp;
					 break;//Ls-Lp
		}

		mother=Math.sqrt( pow2((x2+xL)*z0s+(x1+x2+xs)*z0L)+pow2(x1*(x2+xL)+xL*xs+x2*(xL+xs)-z0s*z0L));
		S21MBW=20*Math.log(Math.abs(2*x2*Math.sqrt(z0s*z0L)/mother))/Math.LN10;

		if(calcLeft && (S21MBW<MBWdB || fsweep<0) ){
//			MBWdone=1;
			fsweep=freq;
			calcLeft=0;
		}else if(!calcLeft && (S21MBW<MBWdB || fsweep>freq*10)){
			MBWdone=1;
		}

	}
	var freqMBW=(cntMBW-2)*nomal;
	if(freqMBW>1000000000){
		freqMBW=freqMBW/1000000000;
		round2(freqMBW);
		writeMBW(round2(freqMBW) + "GHz");
	}else if(freqMBW>1000000){
		freqMBW=freqMBW/1000000;
		round2(freqMBW);
		writeMBW(round2(freqMBW) + "MHz");
	}else if(freqMBW>1000){
		freqMBW=freqMBW/1000;
		round2(freqMBW);
		writeMBW(round2(freqMBW) + "kHz");
	}
}

//集中定数で、zs 並列素子 直列素子 zLの場合のSparaを求める
function CalcSpara2(Pp,Ps,cnumber){
	var z0s=zs.re*Z0;
	var xs=zs.im*Z0;
	var z0L=zL.re*Z0;
	var xL=zL.im*Z0;

	var x1;
	var x2;
	var mother;
	var fsweep;
	var cnt;
	var objTextarea = document.getElementsByName('tarea')[0]; 
	dataS21 = new Array(point);
	dataS11 = new Array(point);

	for(cnt=0; cnt<=point; cnt++){
		fsweep=fstart+cnt*(fstop-fstart)/point;
		if(fsweep==0)fsweep=1/1E3;
		switch(cnumber){	//それぞれの回路に応じてリアクタンスを計算
			case 2 : x2=2*Math.PI*fsweep*Ps;
					 x1=-1/(2*Math.PI*fsweep*Pp);
					 break; //Cp-Ls
			case 4 : x2=-1/(2*Math.PI*fsweep*Ps);
					 x1=-1/(2*Math.PI*fsweep*Pp);
					 break; //Cp-Cs
			case 6 : x2=-1/(2*Math.PI*fsweep*Ps);
					 x1=2*Math.PI*fsweep*Pp;
					 break; //Lp-Cs
			case 8 : x2=2*Math.PI*fsweep*Ps;
					 x1=2*Math.PI*fsweep*Pp;
					 break;//Lp-Ls
		}

		mother=Math.sqrt(pow2((x1+xs)*z0L+(x1+x2+xL)*z0s)+pow2(xs*(x2+xL)+x1*(x2+xL+xs)-z0s*z0L));
		dataS21[cnt]=20*Math.log(Math.abs(2*x1*Math.sqrt(z0s*z0L)/mother))/Math.LN10;
		dataS11[cnt]=20*Math.log(Math.abs(Math.sqrt(pow2(-(x1+xs)*z0L+(x1+x2+xL)*z0s)+pow2(xs*(x2+xL)+x1*(x2+xL+xs)+z0s*z0L))/mother))/Math.LN10;

		if(dataS21[cnt] < -FlatS)	dataS21[cnt]=-FlatS;		//小さすぎたらフラットにする
		if(dataS11[cnt] < -FlatS)	dataS11[cnt]=-FlatS;

//		if(cnt==0){
//		objTextarea.value = round2(mother);	
//		}else{
//			objTextarea.value += "\n"+round2(mother);
//		}
	}
	
	var MBWdone=0;
	var calcLeft=1;
	var MBW=0;
	var S21MBW;
	var nomal=freq/1000;
	var MBWdB=-parseFloat(document.rectMBW.MBWdB.value)
	var cntMBW=0;
	fsweep=freq;
	while(!MBWdone){
		if(calcLeft){
			fsweep=fsweep-nomal;
			cntMBW++;
		}else{
			fsweep=fsweep+nomal;
			cntMBW++;
		}
		
		switch(cnumber){	//それぞれの回路に応じてリアクタンスを計算
			case 2 : x2=2*Math.PI*fsweep*Ps;
					 x1=-1/(2*Math.PI*fsweep*Pp);
					 break; //Cp-Ls
			case 4 : x2=-1/(2*Math.PI*fsweep*Ps);
					 x1=-1/(2*Math.PI*fsweep*Pp);
					 break; //Cp-Cs
			case 6 : x2=-1/(2*Math.PI*fsweep*Ps);
					 x1=2*Math.PI*fsweep*Pp;
					 break; //Lp-Cs
			case 8 : x2=2*Math.PI*fsweep*Ps;
					 x1=2*Math.PI*fsweep*Pp;
					 break;//Lp-Ls
		}

		mother=Math.sqrt(pow2((x1+xs)*z0L+(x1+x2+xL)*z0s)+pow2(xs*(x2+xL)+x1*(x2+xL+xs)-z0s*z0L));
		S21MBW=20*Math.log(Math.abs(2*x1*Math.sqrt(z0s*z0L)/mother))/Math.LN10;

		if(calcLeft && (S21MBW<MBWdB || fsweep<0) ){
			fsweep=freq;
			calcLeft=0;
		}else if(!calcLeft && (S21MBW<MBWdB || fsweep>freq*10)){
			MBWdone=1;
		}

	}
	var freqMBW=(cntMBW-2)*nomal;
	if(freqMBW>1000000000){
		freqMBW=freqMBW/1000000000;
		round2(freqMBW);
		writeMBW(round2(freqMBW) + "GHz");
	}else if(freqMBW>1000000){
		freqMBW=freqMBW/1000000;
		round2(freqMBW);
		writeMBW(round2(freqMBW) + "MHz");
	}else if(freqMBW>1000){
		freqMBW=freqMBW/1000;
		round2(freqMBW);
		writeMBW(round2(freqMBW) + "kHz");
	}

}

//伝送線路+スタブのSパラ
function CalcSpara3(Lmsl,Lstb,stubpattern,direction){
	var z0s=zs.re*Z0;
	var xs=zs.im*Z0;
	var z0L=zL.re*Z0;
	var xL=zL.im*Z0;
	
	var x2;		//x2は常にスタブのリアクタンス
	var mother;		//Sパラの分母
	var fsweep;
	var cnt;
	var beta;
	var cs;
	var si;
	var betastb;
	var betamsl

//	document.formTest.test.value=Lmsl*1E3 + " , " + Lstb*1E3;
//	document.formTest.test.value=round2(minimsl) + " , " + round2(ministb) + " , " + Lmsl*2*Math.PI/(minimsl*3E8) + " , " + Lstb*2*Math.PI/(ministb*3E8);
//	document.formTest.test.value=Z0;
		
	dataS21 = new Array(point);
	dataS11 = new Array(point);

	for(cnt=0; cnt<=point; cnt++){
		fsweep=fstart+cnt*(fstop-fstart)/point;	
		if(fsweep==0)fsweep=1/1E3;
		betaStb=2*Math.PI*fsweep/(ministb*3E8);
		if(stubpattern){		//trueのときショートスタブ　falseのときオープンスタブ
			x2=Z0stb*Math.tan(betaStb*Lstb);
		}else{
			x2=-Z0stb*1/Math.tan(betaStb*Lstb);
		}
		
		betamsl=2*Math.PI*fsweep/(minimsl*3E8);
		cs=Math.cos(betamsl*Lmsl);
		si=Math.sin(betamsl*Lmsl);
		
		if(direction){			//trueのとき左から線路、スタブ　falseのときは左からスタブ、線路の順の回路
			mother=Math.sqrt( pow2(cs*Z0msl*((x2+xL)*z0s+(x2+xs)*z0L)-si*(-pow2(Z0msl)*z0L+x2*(xL*z0s+xs*z0L)))+pow2(cs*Z0msl*(xL*xs+x2*(xL+xs)-z0s*z0L)+si*(xL*pow2(Z0msl)+x2*(-xL*xs+pow2(Z0msl)+z0s*z0L))) );
			dataS21[cnt]=20*Math.log( Math.abs( 2*x2*Z0msl*Math.sqrt(z0s*z0L)/mother )) /Math.LN10 ;
			dataS11[cnt]=20*Math.log( Math.abs( Math.sqrt( pow2(cs*Z0msl*((x2+xL)*z0s-(x2+xs)*z0L)-si*(pow2(Z0msl)*z0L+x2*(xL*z0s-xs*z0L)))+pow2(cs*Z0msl*(xL*xs+x2*(xL+xs)+z0s*z0L)+si*(xL*pow2(Z0msl)+x2*(-xL*xs+pow2(Z0msl)-z0s*z0L))) )/mother ))/Math.LN10 ;
		}else{
			mother=Math.sqrt( pow2(cs*Z0msl*((x2+xL)*z0s+(x2+xs)*z0L)-si*(-pow2(Z0msl)*z0s+x2*(xL*z0s+xs*z0L)))+pow2(cs*Z0msl*(xL*xs+x2*(xL+xs)-z0s*z0L)+si*(xs*pow2(Z0msl)+x2*(-xL*xs+pow2(Z0msl)+z0s*z0L))) );
			dataS21[cnt]=20*Math.log( Math.abs( 2*x2*Z0msl*Math.sqrt(z0s*z0L)/mother )) /Math.LN10 ;
			dataS11[cnt]=20*Math.log( Math.abs( Math.sqrt( pow2(si*((-x2*xL+pow2(Z0msl))*z0s+x2*xs*z0L)+cs*Z0msl*((x2+xL)*z0s-(x2+xs)*z0L))+pow2(cs*Z0msl*(xL*xs+x2*(xL+xs)+z0s*z0L)+si*(xs*pow2(Z0msl)+x2*(-xL*xs+pow2(Z0msl)-z0s*z0L))) )/mother ))/Math.LN10 ;			
		}
		
		if(dataS21[cnt] <= -FlatS)	dataS21[cnt]=-FlatS;		//小さすぎたらフラットにする
		if(dataS11[cnt] <= -FlatS)	dataS11[cnt]=-FlatS;
	}
	
	var MBWdone=0;
	var calcLeft=1;
	var MBW=0;
	var S21MBW;
	var nomal=freq/1000;
	var MBWdB=-parseFloat(document.rectMBW.MBWdB.value)
	var cntMBW=0;
	fsweep=freq;
	while(!MBWdone){
		if(calcLeft){
			fsweep=fsweep-nomal;
			cntMBW++;
		}else{
			fsweep=fsweep+nomal;
			cntMBW++;
		}
		
		betaStb=2*Math.PI*fsweep/(ministb*3E8);
		if(stubpattern){		//trueのときショートスタブ　falseのときオープンスタブ
			x2=Z0stb*Math.tan(betaStb*Lstb);
		}else{
			x2=-Z0stb*1/Math.tan(betaStb*Lstb);
		}
		
		betamsl=2*Math.PI*fsweep/(minimsl*3E8);
		cs=Math.cos(betamsl*Lmsl);
		si=Math.sin(betamsl*Lmsl);

		if(direction){			//trueのとき左から線路、スタブ　falseのときは左からスタブ、線路の順の回路
			mother=Math.sqrt( pow2(cs*Z0msl*((x2+xL)*z0s+(x2+xs)*z0L)-si*(-pow2(Z0msl)*z0L+x2*(xL*z0s+xs*z0L)))+pow2(cs*Z0msl*(xL*xs+x2*(xL+xs)-z0s*z0L)+si*(xL*pow2(Z0msl)+x2*(-xL*xs+pow2(Z0msl)+z0s*z0L))) );
			S21MBW=20*Math.log( Math.abs( 2*x2*Z0msl*Math.sqrt(z0s*z0L)/mother )) /Math.LN10 ;
		}else{
			mother=Math.sqrt( pow2(cs*Z0msl*((x2+xL)*z0s+(x2+xs)*z0L)-si*(-pow2(Z0msl)*z0s+x2*(xL*z0s+xs*z0L)))+pow2(cs*Z0msl*(xL*xs+x2*(xL+xs)-z0s*z0L)+si*(xs*pow2(Z0msl)+x2*(-xL*xs+pow2(Z0msl)+z0s*z0L))) );
			S21MBW=20*Math.log( Math.abs( 2*x2*Z0msl*Math.sqrt(z0s*z0L)/mother )) /Math.LN10 ;
		}

		if(calcLeft && (S21MBW<MBWdB || fsweep<0) ){
			fsweep=freq;
			calcLeft=0;
		}else if(!calcLeft && (S21MBW<MBWdB || fsweep>freq*10)){
			MBWdone=1;
		}

	}
	var freqMBW=(cntMBW-2)*nomal;
	if(freqMBW>1000000000){
		freqMBW=freqMBW/1000000000;
		round2(freqMBW);
		writeMBW(round2(freqMBW) + "GHz");
	}else if(freqMBW>1000000){
		freqMBW=freqMBW/1000000;
		round2(freqMBW);
		writeMBW(round2(freqMBW) + "MHz");
	}else if(freqMBW>1000){
		freqMBW=freqMBW/1000;
		round2(freqMBW);
		writeMBW(round2(freqMBW) + "kHz");
	}
}

function ClearSpara(){		//Sパラをクリアする関数
	var cnt;
	
	dataS21 = new Array(point);
	dataS11 = new Array(point);
	
	for(cnt=0; cnt<=point; cnt++){
		dataS21[cnt]=-1000;		//-1000dB
		dataS11[cnt]=-1000;		//-1000デシベル
	}
}

//各cir関数に与えているsmithは、どちらのチャートに描画するかを選択するためのもの。trueが右でfalseが左
function cir1(zLs,Ycp,UVLs,UVcp,Rcurv,Gcurv,smith,whichC,byoga) {	//Ls - Cp
	var crop= crossp(Gcurv,Rcurv,whichC);	  //交点の座標を取得
	var angel=ANG4(UVLs,UVcp,Rcurv,Gcurv,crop);		//マッチングカーブの4角度を取得
	var Zc=UVtoRX(crop);	//交点のインピーダンスを求める
	var Yc=RXtoGB(Zc);		//交点のアドミタンスを求める
	var Ls= round2(50*Math.abs(Zc.im-zLs.im)/(2*Math.PI*freq)*1e9);		//Lsを計算
	var Cp= round2(Math.abs(Yc.im-Ycp.im)/(50*2*Math.PI*freq)*1e12);	//Cpを計算
	if(Rcurv.ra*2+Gcurv.ra*2 <2 || StdPI(angel.a2) < StdPI(angel.a1) || StdPI2(angel.a3) < StdPI2(angel.a4)){	//素子値が無限を超えたとき
		if(byoga){
			plotCurv(Rcurv,Gcurv, 0, 0, 0, 0, smith, true);	//カーブのプロット
			MatchingErr(UVLs, UVcp,smith);
		}
		return false;
	}else{		//マッチング可能なとき
		if(byoga){
			if(smith){
				writeResult("Ls = "+Ls+" [nH]"+ "<br/>" +"Cp = " + Cp +" [pF]");
				CalcSpara1(Ls/1E9, Cp/1E12, 1);			//Sパラ表示
				cropR=crop;		//右スミスの交点
			}else{
				cropL=crop;		////左スミスの交点	
			}
			document.Qcalculator.resultQcross.value=Math.abs(CalcQ(crop));		//交点のQ値表示
			angel=StdAng(angel);
			plotCurv(Rcurv,Gcurv,angel.a2, angel.a1, angel.a3,angel.a4,smith,false);	//カーブのプロット
			plotPoints(UVLs,UVcp,crop,smith);	//点のプロット

		}
		return true;
	}
}

function cir2(Ycp,zLs,UVcp,UVLs,Gcurv,Rcurv,smith,whichC,byoga) {	//Cp - Ls
	var crop= crossp(Gcurv,Rcurv,whichC);	  //交点の座標を取得
	var angel=ANG4(UVcp,UVLs,Gcurv,Rcurv,crop);		//マッチングカーブの4角度を取得
	var Zc=UVtoRX(crop);		//交点のインピーダンスを求める
	var Yc=RXtoGB(Zc);		//交点のアドミタンスを求める
	var Cp= round2(Math.abs(Yc.im-Ycp.im)/(50*2*Math.PI*freq)*1e12);		//Cpを計算
	var Ls= round2(50*Math.abs(Zc.im-zLs.im)/(2*Math.PI*freq)*1e9);		//Lsを計算
	if(Rcurv.ra*2+Gcurv.ra*2 <2 || StdPI2(angel.a2) < StdPI2(angel.a1) || StdPI(angel.a3) < StdPI(angel.a4)){
		if(byoga){
			plotCurv(Gcurv,Rcurv, 0, 0, 0, 0, smith, true);	//カーブのプロット
			MatchingErr(UVcp, UVLs,smith);
		}
		return false;
	}else{
		if(byoga){
			if(smith){
				writeResult("Cp = "+Cp+" [pF]" + "<br/>" + "Ls = "+Ls+" [nH]");
				CalcSpara2(Cp/1E12, Ls/1E9,  2);				
				cropR=crop;		//右スミスの交点
			}else{
				cropL=crop;		//左スミスの交点	
			}
			document.Qcalculator.resultQcross.value=Math.abs(CalcQ(crop));		//交点のQ値表示
			angel=StdAng(angel);
			plotCurv(Gcurv,Rcurv,angel.a2, angel.a1, angel.a3, angel.a4,smith,false);	//カーブのプロット
			plotPoints(UVcp,UVLs,crop,smith);	//点のプロット

		}
		return true;
	}
}

//各cir関数に与えているsmithは、どちらのチャートに描画するかを選択するためのもの。trueが右でfalseが左
function cir3(zCs,Ycp,UVCs,UVcp,Rcurv,Gcurv,smith,whichC,byoga) {	//Cs - Cp
	var crop= crossp(Gcurv,Rcurv,whichC);	  //交点の座標を取得
	var angel=ANG4(UVCs,UVcp,Rcurv,Gcurv,crop);		//マッチングカーブの4角度を取得
	var Zc=UVtoRX(crop);		//交点のインピーダンスを求める
	var Yc=RXtoGB(Zc);		//交点のアドミタンスを求める
	var Cs= round2(1/(Math.abs(Zc.im-zCs.im)*50*2*Math.PI*freq)*1e12);		//Csを計算
	var Cp= round2(Math.abs(Yc.im-Ycp.im)/(50*2*Math.PI*freq)*1e12);		//Cpを計算
		
	if(Rcurv.ra*2+Gcurv.ra*2 <2 || StdPI(angel.a1) < StdPI(angel.a2) || StdPI2(angel.a3) < StdPI2(angel.a4)){
		if(byoga){
			plotCurv(Rcurv,Gcurv, 0, 0, 0, 0, smith, true);	//カーブのプロット
			MatchingErr(UVCs, UVcp,smith);
		}
		return false;
	}else{
		if(byoga){
			if(smith){
				writeResult("Cs = "+Cs+" [pF]" + "<br/>" + "Cp = "+Cp+" [pF]");
				CalcSpara1(Cs/1E12, Cp/1E12, 3);			//Sパラ表示
				cropR=crop;		//右スミスの交点
			}else{
				cropL=crop;		//左スミスの交点	
			}
			document.Qcalculator.resultQcross.value=Math.abs(CalcQ(crop));		//交点のQ値表示
			angel=StdAng(angel);
			plotCurv(Rcurv,Gcurv,angel.a1, angel.a2, angel.a3,angel.a4,smith, false);	//カーブのプロット
			plotPoints(UVCs,UVcp,crop,smith);	//点のプロット

		}
		return true;
	}
}


function cir4(Ycp,zCs,UVcp,UVCs,Gcurv,Rcurv,smith,whichC,byoga) {	//Cp - Cs
	var crop= crossp(Gcurv,Rcurv,whichC);	  //交点の座標を取得
	var angel=ANG4(UVcp,UVCs,Gcurv,Rcurv,crop);		//マッチングカーブの4角度を取得
	var Zc=UVtoRX(crop);		//交点のインピーダンスを求める
	var Yc=RXtoGB(Zc);		//交点のアドミタンスを求める
	var Cp= round2(Math.abs(Yc.im-Ycp.im)/(50*2*Math.PI*freq)*1e12);		//Cpを計算
	var Cs= round2(1/(Math.abs(Zc.im-zCs.im)*50*2*Math.PI*freq)*1e12);		//Csを計算
	
	if(Rcurv.ra*2+Gcurv.ra*2 <2 || StdPI2(angel.a2) < StdPI2(angel.a1) || StdPI(angel.a4) < StdPI(angel.a3)){
		if(byoga){
			plotCurv(Gcurv,Rcurv, 0, 0, 0, 0, smith, true);	//カーブのプロット
			MatchingErr(UVcp, UVCs,smith);
		}
		return false;
	}else{
		if(byoga){
			if(smith){
				writeResult("Cp = "+Cp+" [pF]" + "<br/>" + "Cs = "+Cs+" [pF]");
				CalcSpara2(Cp/1E12, Cs/1E12, 4);			//Sパラ表示
				cropR=crop;		//右スミスの交点
			}else{
				cropL=crop;		//左スミスの交点	
			}
			document.Qcalculator.resultQcross.value=Math.abs(CalcQ(crop));		//交点のQ値表示
			angel=StdAng(angel);
			plotCurv(Gcurv,Rcurv,angel.a2, angel.a1, angel.a4, angel.a3,smith, false);	//カーブのプロット
			plotPoints(UVcp,UVCs,crop,smith);	//点のプロット
		}
		return true;
	}
}

function cir5(zCs,YLp,UVCs,UVLp,Rcurv,Gcurv,smith,whichC,byoga) {	//Cs - Lp
	var crop= crossp(Rcurv,Gcurv,whichC);	  //交点の座標を取得
	var angel=ANG4(UVCs,UVLp,Rcurv,Gcurv,crop);		//マッチングカーブの4角度を取得
	var Zc=UVtoRX(crop);		//交点のインピーダンスを求める
	var Yc=RXtoGB(Zc);		//交点のアドミタンスを求める
	var Cs= round2(1/(Math.abs(Zc.im-zCs.im)*50*2*Math.PI*freq)*1e12);		//Csを計算
  	var Lp= round2(50/Math.abs(Yc.im-YLp.im)/(2*Math.PI*freq)*1e9);	//Lpを計算
  	
	if(Rcurv.ra*2+Gcurv.ra*2 <2 || StdPI(angel.a1) < StdPI(angel.a2) || StdPI2(angel.a4) < StdPI2(angel.a3)){
		if(byoga){
			plotCurv(Rcurv,Gcurv, 0, 0, 0, 0, smith, true);	//カーブのプロット
			MatchingErr(UVCs, UVLp,smith);
		}
		return false;
	}else{
		if(byoga){
			if(smith){
				writeResult("Cs = "+Cs+" [pF]" + "<br/>" + "Lp = "+Lp+" [nH]");
				CalcSpara1(Cs/1E12, Lp/1E9, 5);			//Sパラ表示
				cropR=crop;		//右スミスの交点
			}else{
				cropL=crop;		//左スミスの交点	
			}
			document.Qcalculator.resultQcross.value=Math.abs(CalcQ(crop));		//交点のQ値表示
			angel=StdAng(angel);
			plotCurv(Rcurv,Gcurv,angel.a1, angel.a2, angel.a4,angel.a3,smith, false);	//カーブのプロット
			plotPoints(UVCs,UVLp,crop,smith);	//点のプロット

		}
		return true;
	}
}


function cir6(YLp,zCs,UVLp,UVCs,Gcurv,Rcurv,smith,whichC,byoga) {	//Lp - Cs
	var crop= crossp(Gcurv,Rcurv,whichC);	  //交点の座標を取得
	var angel=ANG4(UVLp,UVCs,Gcurv,Rcurv,crop);		//マッチングカーブの4角度を取得
	var Zc=UVtoRX(crop);		//交点のインピーダンスを求める
	var Yc=RXtoGB(Zc);		//交点のアドミタンスを求める
	var Lp= round2(50/Math.abs(Yc.im-YLp.im)/(2*Math.PI*freq)*1e9);			//Lpを計算
	var Cs= round2(1/(Math.abs(Zc.im-zCs.im)*50*2*Math.PI*freq)*1e12);		//Csを計算

	if(Rcurv.ra*2+Gcurv.ra*2 <2 || StdPI2(angel.a1) < StdPI2(angel.a2) || StdPI(angel.a4) < StdPI(angel.a3)){
		if(byoga){
			plotCurv(Gcurv,Rcurv, 0, 0, 0, 0, smith, true);	//カーブのプロット
			MatchingErr(UVLp, UVCs,smith);
		}
		return false;
	}else{
		if(byoga){	
			if(smith){
				writeResult("Lp = "+Lp+" [nH]" + "<br/>" + "Cs = "+Cs+" [pF]");
				CalcSpara2(Lp/1E9, Cs/1E12, 6);			//Sパラ表示
				cropR=crop;		//右スミスの交点
			}else{
				cropL=crop;		//左スミスの交点	
			}
			document.Qcalculator.resultQcross.value=Math.abs(CalcQ(crop));		//交点のQ値表示
			angel=StdAng(angel);
			plotCurv(Gcurv,Rcurv,angel.a1, angel.a2, angel.a4, angel.a3,smith, false);	//カーブのプロット
			plotPoints(UVLp,UVCs,crop,smith);	//点のプロット
		}
		return true;
	}
}

function cir7(zLs,YLp,UVLs,UVLp,Rcurv,Gcurv,smith,whichC,byoga) {	//Ls - Lp
	var crop= crossp(Gcurv,Rcurv,whichC);	  //交点の座標を取得
	var angel=ANG4(UVLs,UVLp,Rcurv,Gcurv,crop);		//マッチングカーブの4角度を取得
	var Zc=UVtoRX(crop);		//交点のインピーダンスを求める
	var Yc=RXtoGB(Zc);		//交点のアドミタンスを求める
	var Ls= round2(50*Math.abs(Zc.im-zLs.im)/(2*Math.PI*freq)*1e9);		//Lsを計算
  	var Lp= round2(50/Math.abs(Yc.im-YLp.im)/(2*Math.PI*freq)*1e9);	//Lpを計算
  	
	if(Rcurv.ra*2+Gcurv.ra*2 <2 || StdPI(angel.a2) < StdPI(angel.a1) || StdPI2(angel.a4) < StdPI2(angel.a3)){
		if(byoga){
			plotCurv(Rcurv,Gcurv, 0, 0, 0, 0, smith, true);	//カーブのプロット
			MatchingErr(UVLs, UVLp,smith);
		}
		return false;
	}else{
		if(byoga){
			if(smith){
				writeResult("Ls = "+Ls+" [nH]" + "<br/>" + "Lp = "+Lp+" [nH]");
				CalcSpara1(Ls/1E9, Lp/1E9, 7);			//Sパラ表示
				cropR=crop;		//右スミスの交点
			}else{
				cropL=crop;		//左スミスの交点	
			}
			document.Qcalculator.resultQcross.value=Math.abs(CalcQ(crop));		//交点のQ値表示
			angel=StdAng(angel);
			plotCurv(Rcurv,Gcurv,angel.a2, angel.a1, angel.a4,angel.a3,smith, false);	//カーブのプロット
			plotPoints(UVLs,UVLp,crop,smith);	//点のプロット

		}
		return true;
	}
}

function cir8(YLp,zLs,UVLp,UVLs,Gcurv,Rcurv,smith,whichC,byoga) {	//Lp - Ls
	var crop= crossp(Gcurv,Rcurv,whichC);	  //交点の座標を取得
	var angel=ANG4(UVLp,UVLs,Gcurv,Rcurv,crop);		//マッチングカーブの4角度を取得
	var Zc=UVtoRX(crop);		//交点のインピーダンスを求める
	var Yc=RXtoGB(Zc);		//交点のアドミタンスを求める
	var Lp= round2(50/Math.abs(Yc.im-YLp.im)/(2*Math.PI*freq)*1e9);			//Lpを計算
	var Ls= round2(50*Math.abs(Zc.im-zLs.im)/(2*Math.PI*freq)*1e9);		//Lsを計算

	if(Rcurv.ra*2+Gcurv.ra*2 <2 || StdPI2(angel.a1) < StdPI2(angel.a2) || StdPI(angel.a3) < StdPI(angel.a4)){
		if(byoga){
			plotCurv(Gcurv,Rcurv, 0, 0, 0, 0, smith, true);	//カーブのプロット
			MatchingErr(UVLp, UVLs,smith);
		}
		return false;
	}else{
		if(byoga){
			if(smith){
				writeResult("Lp = "+Lp+" [nH]" + "<br/>" + "Ls = "+Ls+" [nH]");
				CalcSpara2(Lp/1E9, Ls/1E9, 8);			//Sパラ表示
				cropR=crop;		//右スミスの交点
			}else{
				cropL=crop;		//左スミスの交点	
			}
			document.Qcalculator.resultQcross.value=Math.abs(CalcQ(crop));		//交点のQ値表示
			angel=StdAng(angel);
			plotCurv(Gcurv,Rcurv,angel.a1, angel.a2, angel.a3, angel.a4,smith, false);	//カーブのプロット
			plotPoints(UVLp,UVLs,crop,smith);	//点のプロット
		}
		return true;
	}
}

function cir9(zs, zLk, YLk, UVs ,UVLk ,nstb ,nmsl ,Gcurv ,smith,whichC,byoga) {	//Line - ShortStub
	MSLcurv=FindMSLcurv(nmsl,zs);	//伝送線路の円を計算
	var crop= crossp(Gcurv,MSLcurv,whichC);	  //交点の座標を取得
	var Zc=UVtoRX(crop);		//交点のインピーダンスを求める
	var Yc=RXtoGB(Zc);		//交点のアドミタンスを求める

	//スタブ長を計算	
	var Lstub = CalcLstubS(Yc.im,YLk.im,nstb,freq);
	//伝送線路長を計算
	var Lmsl = CalcLmsl1(zs,zLk,YLk,nmsl,freq,whichC);

	var angel=ANG4(UVs,UVLk,MSLcurv,Gcurv,crop);		//マッチングカーブの4角度を取得
	angel=StdAng(angel);
	
//	document.formTest.test.value=round2(ministb*3E8/freq*(angel.a4-angel.a3)/(2*Math.PI)*1E3);

	if(Gcurv.ra*2<(MSLcurv.am+1-MSLcurv.ra) || crop.uu==-10){
		if(byoga){
			plotCurv(MSLcurv,Gcurv, 0, 0, 0, 0, smith, true);	//カーブのプロット
			MatchingErr(UVs, UVLk,smith);
		}
		return false;
	}else{
		if(byoga){
			plotCurv(MSLcurv,Gcurv,angel.a2, angel.a1, angel.a4, angel.a3, smith, false);
			plotPoints(UVs,UVLk,crop,smith);	//点のプロット
			//素子値を表示
			if(smith){
				writeResult("Lmsl = "+Lmsl+" [mm]" + "<br/>" + "Lstb = "+Lstub+" [mm]");
				CalcSpara3(Lmsl/1E3 , Lstub/1E3 , true , true);
				cropR=crop;		//右スミスの交点
			}else{
				cropL=crop;		//左スミスの交点	
			}
			document.Qcalculator.resultQcross.value=Math.abs(CalcQ(crop));		//交点のQ値表示
		}
		return true;
	}
}

function cir10(zs, Ys, zLk, UVs ,UVLk ,nstb ,nmsl ,Gcurv ,smith,whichC,byoga) {	//ShortStub - Line
	MSLcurv=FindMSLcurv(nmsl,zLk);
	var crop= crossp(Gcurv,MSLcurv,whichC);	  //交点の座標を取得
	var Zc=UVtoRX(crop);		//交点のインピーダンスを求める
	var Yc=RXtoGB(Zc);		//交点のアドミタンスを求める
	
	//スタブ長を計算	
	var Lstub = CalcLstubS(Ys.im,Yc.im,nstb,freq);
	//伝送線路長を計算	
	var Lmsl=CalcLmsl2(zs,zLk,Ys,nmsl,freq,whichC);

	var angel=ANG4(UVs,UVLk,Gcurv,MSLcurv,crop);		//マッチングカーブの4角度を取得
	angel=StdAng(angel);

	if(Gcurv.ra*2<(MSLcurv.am+1-MSLcurv.ra) || crop.uu==-10){
		if(byoga){
			plotCurv(Gcurv,MSLcurv, 0, 0, 0, 0, smith, true);	//カーブのプロット
			MatchingErr(UVs, UVLk,smith);
		}
		return false;
	}else{
		if(byoga){
			plotCurv(Gcurv,MSLcurv,angel.a1, angel.a2, angel.a3, angel.a4, smith, false);
			plotPoints(UVs,UVLk,crop,smith);	//点のプロット

			//素子値を表示
			if(smith){
				writeResult("Lstb = "+Lstub+" [mm]" + "<br/>" + "Lmsl = "+Lmsl+" [mm]");
				CalcSpara3(Lmsl/1E3 , Lstub/1E3 , true , false);
				cropR=crop;		//右スミスの交点
			}else{
				cropL=crop;		//左スミスの交点	
			}
			document.Qcalculator.resultQcross.value=Math.abs(CalcQ(crop));		//交点のQ値表示
		}
		return true;
	}
}

function cir11(zs, zLk, YLk, UVs ,UVLk ,nstb ,nmsl ,Gcurv ,smith,whichC,byoga) {	//Line - ShortStub
	MSLcurv=FindMSLcurv(nmsl,zs);	//伝送線路の円を計算
	var crop= crossp(Gcurv,MSLcurv,whichC);	  //交点の座標を取得
	var Zc=UVtoRX(crop);		//交点のインピーダンスを求める
	var Yc=RXtoGB(Zc);		//交点のアドミタンスを求める

	//スタブ長を計算	
	var Lstub = CalcLstubO(Yc.im,YLk.im,nstb,freq);
	//伝送線路長を計算
	var Lmsl = CalcLmsl1(zs,zLk,YLk,nmsl,freq,whichC);

	var angel=ANG4(UVs,UVLk,MSLcurv,Gcurv,crop);		//マッチングカーブの4角度を取得
	angel=StdAng(angel);
	if(Gcurv.ra*2<(MSLcurv.am+1-MSLcurv.ra) || crop.uu==-10){
		if(byoga){
			plotCurv(MSLcurv,Gcurv, 0, 0, 0, 0, smith, true);	//カーブのプロット
			MatchingErr(UVs, UVLk,smith);
		}
		return false;
	}else{
		if(byoga){
			plotCurv(MSLcurv,Gcurv,angel.a2, angel.a1, angel.a3, angel.a4, smith, false);
			plotPoints(UVs,UVLk,crop,smith);	//点のプロット
			//素子値を表示
			if(smith){
				writeResult("Lmsl = "+Lmsl+" [mm]" + "<br/>" + "Lstb = "+Lstub+" [mm]");
				CalcSpara3(Lmsl/1E3 , Lstub/1E3 , false , true);
				cropR=crop;		//右スミスの交点
			}else{
				cropL=crop;		//左スミスの交点	
			}
			document.Qcalculator.resultQcross.value=Math.abs(CalcQ(crop));		//交点のQ値表示
		}
		return true;
	}
}

function cir12(zs, Ys, zLk, UVs ,UVLk ,nstb ,nmsl ,Gcurv ,smith,whichC,byoga) {	//ShortStub - Line
	MSLcurv=FindMSLcurv(nmsl,zLk);
	var crop= crossp(Gcurv,MSLcurv,whichC);	  //交点の座標を取得
	var Zc=UVtoRX(crop);		//交点のインピーダンスを求める
	var Yc=RXtoGB(Zc);			//交点のアドミタンスを求める

	//スタブ長を計算	
	var Lstub = CalcLstubO(Ys.im,Yc.im,nstb,freq);
	//伝送線路長を計算
	var Lmsl=CalcLmsl2(zs,zLk,Ys,nmsl,freq,whichC);
	
	var angel=ANG4(UVs,UVLk,Gcurv,MSLcurv,crop);		//マッチングカーブの4角度を取得
	angel=StdAng(angel);
	
	if(Gcurv.ra*2<(MSLcurv.am+1-MSLcurv.ra) || crop.uu==-10){
		if(byoga){
			plotCurv(Gcurv,MSLcurv, 0, 0, 0, 0, smith, true);	//カーブのプロット
			MatchingErr(UVs, UVLk,smith);
		}
		return false;
	}else{
		if(byoga){
			plotCurv(Gcurv,MSLcurv,angel.a2, angel.a1, angel.a3, angel.a4, smith, false);
			plotPoints(UVs,UVLk,crop,smith);	//点のプロット
			//素子値を表示
			if(smith){
				writeResult("Lstb = "+Lstub+" [mm]" + "<br/>" + "Lmsl = "+Lmsl+" [mm]");
				CalcSpara3(Lmsl/1E3 , Lstub/1E3 , false , false);
				cropR=crop;		//右スミスの交点
			}else{
				cropL=crop;		//左スミスの交点	
			}
			document.Qcalculator.resultQcross.value=Math.abs(CalcQ(crop));		//交点のQ値表示
		}
		return true;
	}

}


//マッチングエラー用の関数
function MatchingErr(UVs,UVL,smith){
	writeResult("マッチングエラー");
	var crop=new positUV(-10,-10); //交差点を表示させないためのトリック
	onlyP=false;
	plotPoints(UVs,UVL,crop,smith);	//点のみプロット
	ClearSpara();
}

  //------以下、プロット関数-----------------------------------
function plotCurv(c1,c2,ang1,ang2,ang3,ang4,smith,ERR){
	var canvas = document.getElementById("canvas");
	if ( ! canvas || ! canvas.getContext ) { return false; }
	var ctx = canvas.getContext("2d");

	var canvas2 = document.getElementById("canvas2");
	if ( ! canvas2 || ! canvas2.getContext ) { return false; }
	var cty = canvas2.getContext("2d");

	//背景のSmithチャート描画
	var img = new Image();
	img.src="img/smith.jpg";
	
    if(smith){
 //   	cty.clearRect(0, 0, 2*Spox, 2*Spoy);		//いったん画面消去
    	cty.drawImage(img,SmithX,SmithY);						//背景のSmithチャート描画

		//第１カーブのプロット１周版
		cty.strokeStyle = 'rgba(40, 160, 250, 0.6)';
		cty.lineWidth = 2;
		cty.beginPath();
		cty.arc(Spox+Srad*c1.am, Spoy, Srad*c1.ra, 0, Math.PI*2, true);
		cty.stroke();

		//第２カーブのプロット 1周版
		cty.strokeStyle = 'rgba(240, 80, 160, 0.6)';
		cty.lineWidth = 2;
		cty.beginPath();
		cty.arc(Spox+Srad*c2.am, Spoy, Srad*c2.ra, 0, Math.PI*2, true);
		cty.stroke();		
		if(!ERR){
			//第１カーブのプロット
			cty.strokeStyle = 'rgba(40, 160, 250, 1)';
			cty.lineWidth = 4;
			cty.beginPath();
			cty.arc(Spox+Srad*c1.am, Spoy, Srad*c1.ra, ang1, ang2, true);
			cty.stroke();
		
			//第２カーブのプロット
			cty.strokeStyle = 'rgba(240, 80, 160, 1)';
			cty.lineWidth = 4;
			cty.beginPath();
			cty.arc(Spox+Srad*c2.am, Spoy, Srad*c2.ra, ang3, ang4, true);
			cty.stroke();
		}
		
    }else{
    	//いったん画面消去
//    	ctx.clearRect(0, 0, 2*Spox, 2*Spoy);		//いったん画面消去
    	ctx.drawImage(img,SmithX,SmithY);						//背景のSmithチャート描画

		//第１カーブのプロット　1周版
		ctx.strokeStyle = 'rgba(0, 204, 0, 0.7)';
		ctx.lineWidth = 2;
		ctx.beginPath();
		ctx.arc(Spox+Srad*c1.am, Spoy, Srad*c1.ra, 0, Math.PI*2, true);
		ctx.stroke();
		
		//第２カーブのプロット　1周版
		ctx.strokeStyle = 'rgba(255, 204, 0, 0.8)';
		ctx.lineWidth = 2;
		ctx.beginPath();
		ctx.arc(Spox+Srad*c2.am, Spoy, Srad*c2.ra, 0, Math.PI*2, true);
		ctx.stroke();
		if(!ERR){
			//第１カーブのプロット
			ctx.strokeStyle = 'rgba(0, 204, 0, 1)';
			ctx.lineWidth = 4;
			ctx.beginPath();
			ctx.arc(Spox+Srad*c1.am, Spoy, Srad*c1.ra, ang1, ang2, true);
			ctx.stroke();		
		
			//第２カーブのプロット
			ctx.strokeStyle = 'rgba(255, 204, 0, 1)';
			ctx.lineWidth = 4;
			ctx.beginPath();
			ctx.arc(Spox+Srad*c2.am, Spoy, Srad*c2.ra, ang3, ang4, true);
			ctx.stroke();
		}

    }
}

function ClearDoneQ(){
//	document.Qcalculator.resultQzs.value="";
//	document.Qcalculator.resultQcross.value="";
//	document.Qcalculator.resultQzL.value="";
	DoneQzs=false;
	DoneQcross=false;
	DoneQzL=false;
}

function ClearQCurv(){
	if(CalcDone){
		branch();
	}else{
		paramCalc();
		ClearDoneQ();
	}
}

function beforeQ(selectQ){

	switch(selectQ){
		case 0 : if(!DoneQzs){		//zsおよびzskのQカーブを表示
					plotQCurv(UVs,true); plotQCurv(UVsk,false); DoneQzs=true;

				 }
				 break;			
		case 1 : if(!DoneQcross){	//交点のQカーブを表示
					plotQCurv(cropR,true); plotQCurv(cropL,false); DoneQcross=true;
				 }
				 break;		
		case 2 : if(!DoneQzL){		//zLおよびzLkのQカーブを表示
					plotQCurv(UVLk,true); plotQCurv(UVL,false); DoneQzL=true;
				 }
				 break;
	}
}

function plotQCurv(Qp,smith){
	var Q=CalcQ(Qp);
	if(Math.abs(Q)<1/1E12)	Q=0.01;
	var Qr=Math.sqrt(pow2(1/Q)+1);
	var Qphi=Math.asin(1/Q/Qr);
	var Qposition;
	
	if(Q>0){		//Qが正のとき、Qカーブはスミスv座標のマイナス側にある
		Qposition=false;
	}else{
		Qposition=true;		
	}
//	document.formTest.test2.value=Qposition;
	if(smith){		//右のスミスチャートにQカーブを描く
		cty.strokeStyle = 'rgba(130, 34 , 100, 1)';
		cty.lineWidth = 2;
		cty.beginPath();
		cty.arc(Spox, Spoy-Srad*1/Q, Srad*Qr, Qphi, Math.PI-Qphi, Qposition);
		cty.stroke();
	}else{			//左のスミスチャートにQカーブを描く
		ctx.strokeStyle = 'rgba(130, 34 , 100, 1)';
		ctx.lineWidth = 2;
		ctx.beginPath();
		ctx.arc(Spox, Spoy-Srad*1/Q, Srad*Qr, Qphi, Math.PI-Qphi, Qposition);
		ctx.stroke();		
	}
}

//各点をプロット
function plotPoints(zs,zL,crop,smith){
	var canvas = document.getElementById("canvas");
	if ( ! canvas || ! canvas.getContext ) { return false; }
	var ctx = canvas.getContext("2d");
  
	var canvas2 = document.getElementById("canvas2");
	if ( ! canvas2 || ! canvas2.getContext ) { return false; }
	var cty = canvas2.getContext("2d");
  
	if(onlyP){
		if(smith){
			cty.clearRect(0, 0, 2*Spox, 2*Spoy);	//いったん画面消去
			//背景のSmithチャート描画
			var img = new Image();
			img.src="img/smith.jpg";		
			cty.drawImage(img,SmithX,SmithY);					//背景のSmithチャート描画
		}else{
			ctx.clearRect(0, 0, 2*Spox, 2*Spoy);	//いったん画面消去
			//背景のSmithチャート描画
			var img = new Image();
			img.src="img/smith.jpg";
			ctx.drawImage(img,SmithX,SmithY);					//背景のSmithチャート描画
		}
		onlyP=false;
	}

    if(smith){
		//Zsの点をプロット
		cty.fillStyle = 'rgba(77, 80, 222, 1)';
		cty.beginPath();
		cty.arc(Spox+Srad*zs.uu, Spoy-Srad*zs.vv, 5, 0, 2*Math.PI, false);
		cty.fill();

		//ZLのプロット
		cty.fillStyle = 'rgba(220, 80, 77, 1)';
		cty.beginPath();
		cty.arc(Spox+Srad*zL.uu, Spoy-Srad*zL.vv, 5, 0, 2*Math.PI, false);
		cty.fill();

		//交点をプロット
		cty.fillStyle = 'rgba(120, 103, 31, 1)';
		cty.beginPath();
		cty.arc(Spox+Srad*crop.uu, Spoy-Srad*crop.vv, 4, 0, 2*Math.PI, false);
		cty.fill();
		
		//交点の白抜き
		cty.fillStyle = 'rgba(245, 245, 245, 1)';
		cty.beginPath();
		cty.arc(Spox+Srad*crop.uu, Spoy-Srad*crop.vv, 2, 0, 2*Math.PI, false);
		cty.fill();

	}else{
		//Zsの点をプロット
		ctx.fillStyle = 'rgba(0, 137, 0, 1)';
		ctx.beginPath();
		ctx.arc(Spox+Srad*zs.uu, Spoy-Srad*zs.vv, 5, 0, 2*Math.PI, false);
		ctx.fill();

		//ZLのプロット
		ctx.fillStyle = 'rgba(255, 159, 0, 1)';
		ctx.beginPath();
		ctx.arc(Spox+Srad*zL.uu, Spoy-Srad*zL.vv, 5, 0, 2*Math.PI, false);
		ctx.fill();

		//交点をプロット
		ctx.fillStyle = 'rgba(120, 103, 31, 1)';
		ctx.beginPath();
		ctx.arc(Spox+Srad*crop.uu, Spoy-Srad*crop.vv, 4, 0, 2*Math.PI, false);
		ctx.fill();
		
		//交点の白抜き
		ctx.fillStyle = 'rgba(240, 240, 240, 1)';
		ctx.beginPath();
		ctx.arc(Spox+Srad*crop.uu, Spoy-Srad*crop.vv, 2, 0, 2*Math.PI, false);
		ctx.fill();
	}
}

//各点をプロット
function plotPoint2(pt1,pt2,smith){			//２点プロットする関数になる予定
	if(smith){
    	cty.clearRect(0, 0, 2*Spox, 2*Spoy);	//背景いったん消去
    	cty.drawImage(img,SmithX,SmithY);		//背景のSmithチャート描画

   		//Zsの点をプロット
		cty.fillStyle = 'rgba(77, 80, 222, 1)';
		cty.beginPath();
		cty.arc(Spox+Srad*pt1.uu, Spoy-Srad*pt1.vv, 5, 0, 2*Math.PI, false);
		cty.fill();

		//ZLのプロット
		cty.fillStyle = 'rgba(220, 80, 77, 1)';
		cty.beginPath();
		cty.arc(Spox+Srad*pt2.uu, Spoy-Srad*pt2.vv, 5, 0, 2*Math.PI, false);
		cty.fill();
	}else{
		ctx.clearRect(0, 0, 2*Spox, 2*Spoy);	//背景いったん消去
    	ctx.drawImage(img,SmithX,SmithY);		//背景のSmithチャート描画
		
		//Zsの点をプロット
		ctx.fillStyle = 'rgba(0, 137, 0, 1)';
		ctx.beginPath();
		ctx.arc(Spox+Srad*pt1.uu, Spoy-Srad*pt1.vv, 5, 0, 2*Math.PI, false);
		ctx.fill();

		//ZLのプロット
		ctx.fillStyle = 'rgba(255, 159, 0, 1)';
		ctx.beginPath();
		ctx.arc(Spox+Srad*pt2.uu, Spoy-Srad*pt2.vv, 5, 0, 2*Math.PI, false);
		ctx.fill();
	}
}