// function matrix3x3用の値設定
	matrixA=new Array();
                matrixA[0]=new Array();
                matrixA[1]=new Array();
                matrixA[2]=new Array();
	matrixB=new Array();
                matrixB[0]=new Array();
                matrixB[1]=new Array();
                matrixB[2]=new Array();
        matrixC=new Array();
                matrixC[0]=new Array();
                matrixC[1]=new Array();
                matrixC[2]=new Array();
//
function matrix33x33(){
//	┌	   	  ┐┌	   	      ┐
//	│3X3配列 matrixA ││3X3配列 matrixB │
//	└	   	  ┘└	   	      ┘
//	を計算して、3X3配列 matrixC に格納
//	外部変数として、matrixA、matrixB、matrixC を用意して呼ぶ

	var matrixN=3;
	for(var i=0;i<matrixN;i++) {
		 for(var j=0;j<matrixN;j++) {
			matrixC[i][j]=0;
		}
	}
	for(var i=0;i<matrixN;i++) {
 		for(var j=0;j<matrixN;j++) {
			for(var k=0;k<matrixN;k++) {
				matrixC[i][j]=matrixC[i][j]+matrixA[i][k]*matrixB[k][j];
			}
		}
	}

//	var matrixN=3;
//	for(var i=0;i<matrixN;i++) {
//		for(var j=0;j<matrixN;j++) {
//			document.write(matrixC[i][j]);
//		}
//	}
}
//
function matrix33x31(){
//	┌	   	  ┐┌	   	      ┐
//	│3X3配列 matrixA ││3X1配列 matrixB │
//	└	   	  ┘└	   	      ┘
//	を計算して、3X1配列 matrixC に格納
//	外部変数として、matrixA、matrixB、matrixC を用意して呼ぶ
//
	var matrixN=3;
	for(var i=0;i<matrixN;i++) {
		 for(var j=0;j<matrixN;j++) {
			matrixC[i][j]=0;
		}
	}
	var matrixN=3;
	for(var i=0;i<matrixN;i++) {
		 for(var j=0;j<matrixN;j++) {
			matrixC[i][0]=(matrixA[i][j] * matrixB[j][0])+matrixC[i][0];
		}
	}
//
//	var matrixN=3;
//	for(var i=0;i<matrixN;i++) {
//			document.write(matrixC[i][0]);
//			document.write(',');
//	}
}
//
function calc(TLEString){
	//TLEString : tle データ
	// 外部で calc_out[] 配列を宣言してから呼ぶ
	// calc_out[0] : 衛星の名称
	// calc_out[1] : 緯度 Latitude
	// calc_out[2] : 経度 Longitude
	//
	//calc_out の 初期化
	for(var i=0;i<calc_out.length;i++) {
		calc_out[i]="";
	}
//
	var SplitTLE = new Array();
	var TLEelement = new Array();
	TLEelement[0] = new Array();
	TLEelement[1] = new Array();

	SplitTLE = TLEString.split(/\n/);

	calc_out[0] = SplitTLE[0];	//衛星の名称

	TLEelement[0][0] = SplitTLE[1].slice(01-1,01);	//TLEデータの行番号
	TLEelement[0][1] = SplitTLE[1].slice(03-1,07);	//衛星番号
	TLEelement[0][2] = SplitTLE[1].slice(08-1,08);	//衛星の分類
	TLEelement[0][3] = SplitTLE[1].slice(10-1,11);	//衛星が打ち上げられた西暦の下２桁
	TLEelement[0][4] = SplitTLE[1].slice(12-1,14);	//その年の打ち上げ番号
	TLEelement[0][5] = SplitTLE[1].slice(15-1,17);	//衛星の打ち上げ場所
	TLEelement[0][6] = SplitTLE[1].slice(19-1,20);	//元期（年）
	TLEelement[0][7] = SplitTLE[1].slice(21-1,32);	//元期（１ 月１ 日からの通算日）
	TLEelement[0][8] = SplitTLE[1].slice(34-1,43);	//平均運動の減衰率Ｎ１
	TLEelement[0][9] = SplitTLE[1].slice(45-1,52);	//平均運動の減衰率Ｎ２
	TLEelement[0][10] = SplitTLE[1].slice(54-1,61);	//ＢＳＴＡＲ
	TLEelement[0][11] = SplitTLE[1].slice(63-1,63);	//暦の型
	TLEelement[0][12] = SplitTLE[1].slice(65-1,68);	//Element数
	TLEelement[0][13] = SplitTLE[1].slice(69-1,69);	//チェックサム

	TLEelement[1][0] = SplitTLE[2].slice(01-1,01);	//TLEデータの行番号
	TLEelement[1][1] = SplitTLE[2].slice(03-1,07);	//衛星番号
	TLEelement[1][2] = SplitTLE[2].slice(09-1,16);	//軌道傾斜角ｉ[deg]
	TLEelement[1][3] = SplitTLE[2].slice(18-1,25);	//昇交点赤径Ω[deg]
	TLEelement[1][4] = SplitTLE[2].slice(27-1,33);	//軌道離心率ｅ
	TLEelement[1][5] = SplitTLE[2].slice(35-1,42);	//近地点引数ω[deg]
	TLEelement[1][6] = SplitTLE[2].slice(44-1,51);	//平均近点離角Ｍ[deg]
	TLEelement[1][7] = SplitTLE[2].slice(53-1,63);	//平均運動ｎ[revs/day]
	TLEelement[1][8] = SplitTLE[2].slice(64-1,68);	//軌道周回数[revs]
	TLEelement[1][9] = SplitTLE[2].slice(69-1,69);	//チェックサム

	//for (var i=0;i<2;i++){
	//	for( var j=0;j<13;j++){
	//		document.write(i + "," +j+"⇒");
	//		document.write(TLEelement[i][j]);
	//		document.write('/<br>');
	//	}
	//}
	//document.getElementById("debug").innerHTML = document.getElementById("debug").innerHTML +'<br>'+TLEelement[1][8];
	//
	//
	//元期ET (Epoch Time)：軌道要素を確定した時刻　2006年120.72277529 日(UT)
	//var ET=120.72277529;
	var ET=TLEelement[0][7] - 0;
	//近地点引数ω (Argument of perigee) 　ω0 = 14.7699°
	//var Ap0=14.7699;
	var Ap0=TLEelement[1][5] - 0;
	//軌道傾斜角i (inclination angle) 　i = 98.2104°
	//var ia=98.2104;
	var ia=TLEelement[1][2] - 0;
	//昇交点赤経Ω (right ascension of ascending node) 　Ω0 =195.1270°
	//var ra0=195.1270;
	var ra0=TLEelement[1][3] - 0;
	//離心率e (Eccentricity) 　e = 0.0001679
	//var e=0.0001679;
	var e=(TLEelement[1][4] - 0)/10000000;
	//平均近点角M0 (Mean Anomaly) 　M0 = 345.3549°
	//var M0=345.3549;
	var M0=TLEelement[1][6] - 0;
	//平均運動M1 (Mean Motion) 　M1 = 14.59544429(rev/day)
	//var M1=14.59544429;
	var M1=TLEelement[1][7] - 0;
	//平均運動変化係数M2 　M2 = 0.00000232(rev/day2)
	//var M2=0.00000232;
	var M2=TLEelement[0][8].substr(1);
	if(TLEelement[0][8].match(/^\-/)){
		M2=M2*(-1)
	}
	//地球の半径　6,378.137km
	var Er=6378.137;
	//観測日時ObserveT(UTC)
	//var ObserveT =new Date();
	var ObserveT =NowTime;
	var StandardT=new Date('2006/1/1 00:00:00');	//基準時刻
	var NT=((ObserveT.getTime() - StandardT.getTime() - 9*60*60*1000)/(24*60*60*1000)); // 基準時刻からの経過日数
	//元期から観測時刻までの経過日数（年号が変わる際の処理が必要）
	var EpochStrtT=new Date('20'+TLEelement[0][6]+'/1/1 00:00:00');	//基準時刻
	var DT=NT-ET-((EpochStrtT.getTime()-StandardT.getTime())/(24*60*60*1000)) + 1;

	//document.getElementById("debug").innerHTML = document.getElementById("debug").innerHTML +'<br>ET⇒'+ ET+'<br>Ap0⇒'+ Ap0+'<br>ia⇒'+ ia+'<br>ra0⇒'+ ra0+'<br>e⇒'+ e+'<br>M0⇒'+ M0+'<br>M1⇒'+ M1+'<br>M2⇒'+ M2+'<br>Er⇒'+ Er+'<br>NT⇒'+ NT+'<br>DT⇒'+ DT;

	//軌道長半径a の計算
	var GM=2.975537*Math.pow(10,15);
	var a=Math.pow((GM/(4*Math.pow(Math.PI,2)*Math.pow((M1+M2*DT),2))),(1/3));
	//document.getElementById("debug").innerHTML = document.getElementById("debug").innerHTML +'<br>a⇒'+a;

	//平均近点角Ｍ(°)の計算
	var Mrev=(M0/360)+(M1*DT)+(M2*Math.pow(DT,2))/2;
	var M=(Mrev-Math.floor(Mrev))*360;
	//document.getElementById("debug").innerHTML = document.getElementById("debug").innerHTML +'<br>M⇒'+M;

	//離心近点角E(°)の計算
	//E-e*sinE=M ケプラーの第２法則
	//ニュートンラフソン法による算出
	var E;
	var Ecalc=M+e*Math.sin((M/180) * Math.PI)
	var tmp_count;
	for (tmp_count=0;tmp_count<100;tmp_count++){
		E=M+e*Math.sin((Ecalc/180) * Math.PI);
		if((Ecalc-E)< 0.000000000001){
			break;
		}
		Ecalc=E;
	}
	if(tmp_count>=100){
		alert('離心近点角算出エラー');
	}
	//document.getElementById("debug").innerHTML = document.getElementById("debug").innerHTML +'<br>E⇒'+E;

	//軌道面上の座標(U,V)の計算
	var U=a*Math.cos((E/180) * Math.PI)-a*e;
	var V=a*Math.sqrt((1-e*e))*Math.sin((E/180) * Math.PI);
	//document.getElementById("debug").innerHTML = document.getElementById("debug").innerHTML +'<br>U⇒'+U+'<br>V⇒'+V;


	//近点引数の計算Ap 昇交赤経ra の計算

	var Ap=Ap0+(180*0.174*(2-2.5*Math.pow(Math.sin((ia/180) * Math.PI),2))*DT/(Math.PI*(Math.pow((a/Er),3.5))));
	var ra=ra0-(180*0.174*Math.cos((ia/180) * Math.PI)*DT/(Math.PI*(Math.pow((a/Er),3.5))));

	//document.getElementById("debug").innerHTML = document.getElementById("debug").innerHTML +'<br>Ap⇒'+Ap+'<br>ra⇒'+ra

	//地球中心の三次元座標Xe,Ye,Zeに変換
	        matrixA[0]=[Math.cos((ra/180) * Math.PI) , -1*Math.sin((ra/180) * Math.PI) , 0];
	        matrixA[1]=[Math.sin((ra/180) * Math.PI) ,    Math.cos((ra/180) * Math.PI) , 0];
	        matrixA[2]=[                            0 ,                                0 , 1];
	//
	        matrixB[0]=[ 1,                            0,                                0];
	        matrixB[1]=[ 0, Math.cos((ia/180) * Math.PI), -1*Math.sin((ia/180) * Math.PI)];
	        matrixB[2]=[ 0, Math.sin((ia/180) * Math.PI),    Math.cos((ia/180) * Math.PI)];
	//
	        matrixC[0]=[0.0,0.0,0.0];
	        matrixC[1]=[0.0,0.0,0.0];
	        matrixC[2]=[0.0,0.0,0.0];
	matrix33x33();
	//
	        matrixA[0]=[ matrixC[0][0] , matrixC[0][1] , matrixC[0][2] ];
	        matrixA[1]=[ matrixC[1][0] , matrixC[1][1] , matrixC[1][2] ];
	        matrixA[2]=[ matrixC[2][0] , matrixC[2][1] , matrixC[2][2] ];
	//
	        matrixB[0]=[Math.cos((Ap/180) * Math.PI) , -1*Math.sin((Ap/180) * Math.PI) , 0];
	        matrixB[1]=[Math.sin((Ap/180) * Math.PI) ,    Math.cos((Ap/180) * Math.PI) , 0];
	        matrixB[2]=[                            0 ,                                0 , 1];
	//
	        matrixC[0]=[0.0,0.0,0.0];
	        matrixC[1]=[0.0,0.0,0.0];
	        matrixC[2]=[0.0,0.0,0.0];
	matrix33x33();
	//
	        matrixA[0]=[ matrixC[0][0] , matrixC[0][1] , matrixC[0][2] ];
	        matrixA[1]=[ matrixC[1][0] , matrixC[1][1] , matrixC[1][2] ];
	        matrixA[2]=[ matrixC[2][0] , matrixC[2][1] , matrixC[2][2] ];
	//
	        matrixB[0]=[ U , 0 , 0];
	        matrixB[1]=[ V , 0 , 0];
	        matrixB[2]=[ 0 , 0 , 0];
	//
	        matrixC[0]=[0.0,0.0,0.0];
	        matrixC[1]=[0.0,0.0,0.0];
	        matrixC[2]=[0.0,0.0,0.0];
	matrix33x31();
	var Xe=matrixC[0][0];
	var Ye=matrixC[1][0];
	var Ze=matrixC[2][0];

	//document.getElementById("debug").innerHTML = document.getElementById("debug").innerHTML +'<br>Xe⇒'+Xe+'<br>Te⇒'+Ye+'<br>Ze⇒'+Ze;

	//グリニッジ子午線の赤経
	// 2006/1/1 0:0:0 のグリニッジ恒星時の基準時刻からの経過日数：0.276444444 (rev)
	var Tgrev = 0.276444444 + 1.002737909 * NT;
	var Tg=(Tgrev-Math.floor(Tgrev))*360;
	//document.getElementById("debug").innerHTML = document.getElementById("debug").innerHTML +'<br>Tg⇒'+Tg;

	//グリニッジ子午線の方向をX軸とする座標 X,Y,Z に変換
	//
	        matrixA[0]=[ Math.cos(-1*(Tg/180) * Math.PI) , -1*Math.sin(-1*(Tg/180) * Math.PI) , 0 ];
	        matrixA[1]=[ Math.sin(-1*(Tg/180) * Math.PI) , Math.cos(-1*(Tg/180) * Math.PI)    , 0 ];
	        matrixA[2]=[                               0 ,                                  0 , 1 ];
	//
	        matrixB[0]=[ Xe , 0 , 0];
	        matrixB[1]=[ Ye , 0 , 0];
	        matrixB[2]=[ Ze , 0 , 0];
	//
	        matrixC[0]=[0.0,0.0,0.0];
	        matrixC[1]=[0.0,0.0,0.0];
	        matrixC[2]=[0.0,0.0,0.0];
	matrix33x31();
	var X=matrixC[0][0];
	var Y=matrixC[1][0];
	var Z=matrixC[2][0];

	//document.getElementById("debug").innerHTML = document.getElementById("debug").innerHTML +'<br>X⇒'+X+'<br>Y⇒'+Y+'<br>Z⇒'+Z;

	//緯度 Latitude、経度 Longitude に変換
	var Latitude=((Math.asin( Z/ (Math.sqrt( X*X+Y*Y+Z*Z ))))/Math.PI)*180;
	var Longitude=(Math.atan2(Y,X)/Math.PI)*180;
	calc_out[1]=Latitude;
	calc_out[2]=Longitude;
	//document.getElementById("debug").innerHTML = document.getElementById("debug").innerHTML +'<br>Latitude⇒'+Latitude+'<br>Longitude⇒'+Longitude;
}
