/* mapping functions */

var xWidth = 465; //width of the total map in pixels
var yWidth = 232; //height of the total map in pixels
var xOffset = 221; //x offset of the map in pixels
var yOffset = 105; //y offset if the map in pixels

function lTox(l) {
	return(xOffset+Math.round((l*xWidth)/360));
}

function bToy(b) {
	return(yOffset-Math.round((b*yWidth)/180));
}

function showObs1() {
	var list = document.getElementById('obs1other');
	var element = document.getElementById('eigen');
	if (!element.checked) element = list.options[list.selectedIndex];
	
	var l = element.getAttribute('coords').split(',')[0];
	var b = element.getAttribute('coords').split(',')[1];
	var t1 = element.getAttribute('times').split(',')[0];
	var t2 = element.getAttribute('times').split(',')[1];
	var t3 = element.getAttribute('times').split(',')[2];
	var t4 = element.getAttribute('times').split(',')[3];
	document.getElementById('obs1lengte').value = l;
	document.getElementById('obs1breedte').value = b;
	document.getElementById('obs1tijd1').value = t1;
	document.getElementById('obs1tijd2').value = t2;
	document.getElementById('obs1tijd3').value = t3;
	document.getElementById('obs1tijd4').value = t4;
	var x = lTox(l)-18;//correctie voor hotspot
	var y = bToy(b)-18;//correctie voor hotspot
	var obs1 = document.getElementById('obs1img');
	obs1.style.left = x+'px';
	obs1.style.top = y+'px';
	obs1.style.display = 'block';
}
function showObs2(index) {
	var element = document.getElementById('obs2_'+index);
	if (element.value == 'other2') element = document.getElementById('obs2other').options[document.getElementById('obs2other').selectedIndex];
	var l = element.getAttribute('coords').split(',')[0];
	var b = element.getAttribute('coords').split(',')[1];
	var t1 = element.getAttribute('times').split(',')[0];
	var t2 = element.getAttribute('times').split(',')[1];
	var t3 = element.getAttribute('times').split(',')[2];
	var t4 = element.getAttribute('times').split(',')[3];
	document.getElementById('obs2lengte').value = l;
	document.getElementById('obs2breedte').value = b;
	document.getElementById('obs2tijd1').value = t1;
	document.getElementById('obs2tijd2').value = t2;
	document.getElementById('obs2tijd3').value = t3;
	document.getElementById('obs2tijd4').value = t4;
	var x = lTox(l)-4;//correctie voor hotspot
	var y = bToy(b)-18;///correctie voor hotspot
	var obs2 = document.getElementById('obs2img');
	obs2.style.left = x+'px';
	obs2.style.top = y+'px';
	obs2.style.display = 'block';
}

/* AE distance calculations from steven van roode */

 /* Bronvermelding:
Voor de berekening van de contacttijden is gebruik gemaakt van het algoritme en de elementen van Jean Meeus, 'Transits' (Willmann-Bell, 1989).
De programmacode voor het berekenen van de contacttijden is gebaseerd op code van Franco Martinelli en aangepast door Steven M. van Roode.
De bepaling van de zonneparallax gaat terug op het principe dat in 1716 door Edmond Halley is geformuleerd.
*/

var graden  = 180/Math.PI;
var rad =  1/graden;

// 2004
var ele_T0=8

var ele11=-229.4542; 
var ele12=233.6932; 
var ele13=0.01512; 
var ele14=-0.000079;

var ele21=-589.2948; 
var ele22=-56.9904; 
var ele23=0.06953; 
var ele24=0.000071;

var ele31=22.8860; 
var ele32=0.0036; 
var ele33=-0.00001; 

var ele41=300.2378; 
var ele42=14.9980; 
var ele43=0.0; 

var ele51=22.7223; 
var ele52=-0.0122; 
var ele53=0.0; 

var ele61=300.1687; 
var ele62=15.0684; 
var ele63=0.0; 

var ele71=1.0150844; 
var ele72=0.0000053; 
var ele73=0.0; 

var ele81=0.2888829; 
var ele82=0.0000006; 
var ele83=0.00000027; 

/* 2012
var ele_T0=2

var ele11=253.0583; 
var ele12=232.6966; 
var ele13=0.01583; 
var ele14=-0.000080;

var ele21=507.0395; 
var ele22=-60.4263; 
var ele23=0.06675; 
var ele24=0.000076;

var ele31=22.6775; 
var ele32=0.0042; 
var ele33=-0.00001; 

var ele41=210.3335; 
var ele42=14.9981; 
var ele43=0.0; 

var ele51=22.8183; 
var ele52=-0.0126; 
var ele53=0.0; 

var ele61=210.4097; 
var ele62=15.0682; 
var ele63=0.0; 

var ele71=1.0147447; 
var ele72=0.0000056; 
var ele73=0.0; 

var ele81=0.2887038; 
var ele82=0.0000011; 
var ele83=0.00000027; 
*/

function UnixToTime(unixtimestamp) {
	secondsToday = unixtimestamp%86400; //seconds left on last day;
	decHours = secondsToday/3600;
	return decHours;
}

var tijd=new Array();
var hoogte=new Array();
var hoek=new Array();
var afstand=new Array();

function rhocosfi(Lat,Hgt) {
	var U=Math.atan(Math.tan(rad*Lat)*0.99664719);
	var rhocfi=Math.cos(U)+(Hgt/6378140)*Math.cos(Lat*rad);
	return rhocfi;
}

function rhosinfi(Lat,Hgt) {
	var U=Math.atan(Math.tan(rad*Lat)*0.99664719);
	var rhosfi=0.99664719*Math.sin(U)+(Hgt/6378140)*Math.sin(Lat*rad);
	return rhosfi;
}

function Sgn(n) {	
	var S
	if (n<0){S=-1} else {S=1}
	return S
}

function HoekAfronden(a) {
	var Ag
	var Sgn
	if (a<0) {Sgn=-1} else {Sgn=1}
	var I=Math.floor(Math.abs(a))
	var F=Math.abs(a)-I
	var R=I%360
	if (Sgn>0) {Ag=R+F} else {Ag=360-(R+F)} 
	return Ag
}

function FormatLD(afs) {
	var p=(Math.floor((afs)*1000))/1000
	return p
}

function HMStoDec(time) {
	var eerstepunt=time.indexOf(".");
	var tweedepunt=time.indexOf(".",eerstepunt+1);
	var laatste=time.length;
	var hour=parseFloat(time.substring(0,eerstepunt));
	var minute=parseFloat(time.substring(eerstepunt+1,tweedepunt));
	var second=parseFloat(time.substring(tweedepunt+1,laatste+1));
	var decimaal=hour+(minute/60)+(second/3600);
	return decimaal
}

function HoogteAzimut(Lat,Decl,TA)
{	
	TA=TA+360
	TA=HoekAfronden(TA)
	if (TA<180) {AP=TA} else {AP=360-TA}
 	var D=Math.sin(rad*Lat)*Math.sin(rad*Decl)+Math.cos(rad*Lat)*Math.cos(rad*Decl)*Math.cos(rad*AP)
	Alt=graden*Math.asin(D)
	var D=(Math.sin(rad*Decl)-Math.sin(rad*Lat)*Math.sin(rad*Alt))/(Math.cos(rad*Lat)*Math.cos(rad*Alt))
	Az=graden*Math.acos(D)
	if (TA<180) {Az=360-Math.abs(Az)}
}

function BerekenTijd(Long,Lat,Par,Phase)
{
	var Tau=0;
	var L=0;
	var fuso=0
	var DET=67
	var Hgt=10;
	var rsf=rhosinfi(Lat,Hgt);
	var rcf=rhocosfi(Lat,Hgt);
	var T=0;
 	for (var k=1; k<=5; k++) { 
   		for (var rip=1; rip<=6; rip++) {
			var Xa=ele11+ele12*T+ele13*(T*T)+ele14*(T*T*T);
			var Ya=ele21+ele22*T+ele23*(T*T)+ele24*(T*T*T);
			var Xpa=ele12+2*ele13*T+3*ele14*(T*T);
			var Ypa=ele22+2*ele23*T+3*ele24*(T*T);
			var da=ele31+ele32*T+ele33*(T*T);
			da=da*rad;
			var Ma=ele41+ele42*T+ele43*(T*T);
			var db=ele51+ele52*T+ele53*(T*T);
            db=db*rad;
			var Mb=ele61+ele62*T+ele63*(T*T);
			var Ra=ele71+ele72*T+ele73*(T*T);
			var Dea=ele81+ele82*T+ele83*(T*T);
			var Ha=Ma-Long-0.00417807*DET;
	    	Ha=rad*Ha;
			var Hb=Mb-Long-0.00417807*DET;
	    	Hb=Hb*rad;	
			var Zga=rsf*Math.sin(da)+rcf*Math.cos(Ha)*Math.cos(da);
			var Zgb=rsf*Math.sin(db)+rcf*Math.cos(Hb)*Math.cos(db);
			Ra=Ra-Zga/23455;
			Dea=Dea-Zgb/23455;
			var dx=-Par*rcf*((Math.sin(Ha)/Ra)-(Math.sin(Hb)/Dea));
			var a=rsf*( (Math.cos(da)/Ra) - (Math.cos(db)/Dea) );
			var b=-rcf*((Math.sin(da)*Math.cos(Ha))/Ra-(Math.sin(db)*Math.cos(Hb)/Dea));
			var dy=Par*(a+b);
			var dxp=-0.261*Par*rcf*(Math.cos(Ha)/Ra-Math.cos(Hb)/Dea);
			var dyp=+0.261*Par*rcf*(Math.sin(da)*Math.sin(Ha)/Ra-Math.sin(db)*Math.sin(Hb)/Dea);
			Xa=Xa+dx;
            Xpa=Xpa+dxp;
            Ya=Ya+dy;
            Ypa=Ypa+dyp;
			var sa=959.63/Ra;
			var sb=8.41/Dea;
			switch(k) {
				case 1:	L=sa+sb; break;
				case 2:	L=sa-sb; break;
				case 3:	L=sa-sb; break;
				case 4:	L=sa-sb; break;
				case 5:	L=sa+sb; break;
			}
			var n2=Xpa*Xpa+Ypa*Ypa;
	    	n=Math.sqrt(n2);	
			var SM=(Xa*Ypa-Ya*Xpa)/(n*L);
			if ( ((SM*SM)>1) && (k!=3))  {var TC=9999};
			switch(k) {
				case 1:	Tau=-(Xa*Xpa+Ya*Ypa)/n2-(L/n)*Math.sqrt(1-SM*SM); break;
				case 2:	Tau=-((Xa*Xpa+Ya*Ypa)/n2)-((L/n)*Math.sqrt(1-(SM*SM))); break;
				case 3:	Tau=-((Xa*Xpa+Ya*Ypa)/n2); break;
				case 4:	Tau=-((Xa*Xpa+Ya*Ypa)/n2)+((L/n)*Math.sqrt(1-(SM*SM))); break;
				case 5:	Tau=-((Xa*Xpa+Ya*Ypa)/n2)+((L/n)*Math.sqrt(1-(SM*SM))); break;
			}
            T=T+Tau; 
      	}
		var TC=ele_T0+T+fuso;
        TC=TC-DET/3600;
		HoogteAzimut(Lat,da*graden,Ha*graden);
		var ang=Math.atan2(-Xa,Ya);
 		if (ang<0) {ang=(ang+2*Math.PI)};
		tijd[k]=TC;
		hoogte[k]=Alt;
		hoek[k]=ang*graden
 		afstand[k]=Math.sqrt((Xa*Xa)+(Ya*Ya));
	}
	return tijd[Phase]
}

function BerekenOvergang(Long,Lat,Par) {
	var Tau=0;
	var L=0;
	var fuso=0
	var DET=67
	var Hgt=10;
	var rsf=rhosinfi(Lat,Hgt);
	var rcf=rhocosfi(Lat,Hgt);
	var T=0;
  	for (var k=1; k<=5; k++) { 
   		for (var rip=1; rip<=6; rip++) {
			var Xa=ele11+ele12*T+ele13*(T*T)+ele14*(T*T*T);
			var Ya=ele21+ele22*T+ele23*(T*T)+ele24*(T*T*T);
			var Xpa=ele12+2*ele13*T+3*ele14*(T*T);
			var Ypa=ele22+2*ele23*T+3*ele24*(T*T);
			var da=ele31+ele32*T+ele33*(T*T);
			da=da*rad;
			var Ma=ele41+ele42*T+ele43*(T*T);
			var db=ele51+ele52*T+ele53*(T*T);
            db=db*rad;
			var Mb=ele61+ele62*T+ele63*(T*T);
			var Ra=ele71+ele72*T+ele73*(T*T);
			var Dea=ele81+ele82*T+ele83*(T*T);
			var Ha=Ma-Long-0.00417807*DET;
	   		Ha=rad*Ha;
			var Hb=Mb-Long-0.00417807*DET;
	    	Hb=Hb*rad;	
			var Zga=rsf*Math.sin(da)+rcf*Math.cos(Ha)*Math.cos(da);
			var Zgb=rsf*Math.sin(db)+rcf*Math.cos(Hb)*Math.cos(db);
			Ra=Ra-Zga/23455;
			Dea=Dea-Zgb/23455;
			var dx=-Par*rcf*((Math.sin(Ha)/Ra)-(Math.sin(Hb)/Dea));
			var a=rsf*( (Math.cos(da)/Ra) - (Math.cos(db)/Dea) );
			var b=-rcf*((Math.sin(da)*Math.cos(Ha))/Ra-(Math.sin(db)*Math.cos(Hb)/Dea));
			var dy=Par*(a+b);
			var dxp=-0.261*Par*rcf*(Math.cos(Ha)/Ra-Math.cos(Hb)/Dea);
			var dyp=+0.261*Par*rcf*(Math.sin(da)*Math.sin(Ha)/Ra-Math.sin(db)*Math.sin(Hb)/Dea);
	   		Xa=Xa+dx;
            Xpa=Xpa+dxp;
            Ya=Ya+dy;
            Ypa=Ypa+dyp;
			var sa=959.63/Ra;
			var sb=8.41/Dea;
			switch(k) {
				case 1:	L=sa+sb; break;
				case 2:	L=sa-sb; break;
				case 3:	L=sa-sb; break;
				case 4:	L=sa-sb; break;
				case 5:	L=sa+sb; break;
			}
			var n2=Xpa*Xpa+Ypa*Ypa;
	   		n=Math.sqrt(n2);	
			var SM=(Xa*Ypa-Ya*Xpa)/(n*L);
			if ( ((SM*SM)>1) && (k!=3))  {var TC=9999};
			switch(k) {
				case 1:	Tau=-(Xa*Xpa+Ya*Ypa)/n2-(L/n)*Math.sqrt(1-SM*SM) ; break;
				case 2:	Tau=-((Xa*Xpa+Ya*Ypa)/n2)-((L/n)*Math.sqrt(1-(SM*SM))); break;
				case 3:	Tau=-((Xa*Xpa+Ya*Ypa)/n2); break;
				case 4:	Tau=-((Xa*Xpa+Ya*Ypa)/n2)+((L/n)*Math.sqrt(1-(SM*SM))); break;
				case 5:	Tau=-((Xa*Xpa+Ya*Ypa)/n2)+((L/n)*Math.sqrt(1-(SM*SM))); break;
			}
            T=T+Tau; 
      	}
		var TC=ele_T0+T+fuso;
		TC=TC-DET/3600;
		HoogteAzimut(Lat,da*graden,Ha*graden);
		var ang=Math.atan2(-Xa,Ya);
 		if (ang<0) {ang=(ang+2*Math.PI)};
		tijd[k]=TC;
		hoogte[k]=Alt;
		hoek[k]=ang*graden
 		afstand[k]=Math.sqrt((Xa*Xa)+(Ya*Ya));
	}
	var tijdsduur=(tijd[4]-tijd[2]);
	return tijdsduur
}

function BerekenParallax(form) {
	var obs1lengte = document.getElementById('obs1lengte').value;
	var obs1breedte = document.getElementById('obs1breedte').value;
	var obs1tijd1 = document.getElementById('obs1tijd1').value;
	var obs1tijd2 = document.getElementById('obs1tijd2').value;
	var obs1tijd3 = document.getElementById('obs1tijd3').value;
	var obs1tijd4 = document.getElementById('obs1tijd4').value;
	
	var obs2lengte = document.getElementById('obs2lengte').value;
	var obs2breedte = document.getElementById('obs2breedte').value;
	var obs2tijd1 = document.getElementById('obs2tijd1').value;
	var obs2tijd2 = document.getElementById('obs2tijd2').value;
	var obs2tijd3 = document.getElementById('obs2tijd3').value;
	var obs2tijd4 = document.getElementById('obs2tijd4').value;
	
	if (form.method[0].checked) {
		if (obs1tijd2==0||obs1tijd3==0||obs2tijd2==0||obs2tijd3==0) {
			alert('Halley\'s methode kan niet worden gebruikt omdat 1 van de 2 binnenste contacttijden bij 1 van de 2 waarnemers ontbreekt\nHalley\'s method can not be used because 1 of the 2 inner contact times are missing with 1 of the 2 selected observers');
	
		} else {
			var tijdsduurA=(obs1tijd3-obs1tijd2)/3600;//((HMStoDec(form.tijdstipA2.value))-(HMStoDec(form.tijdstipA1.value)));
			var tijdsduurB=(obs2tijd3-obs2tijd2)/3600;//((HMStoDec(form.tijdstipB2.value))-(HMStoDec(form.tijdstipB1.value)));
			var waarneemverschil=(tijdsduurA-tijdsduurB);
			var parzon=8.794148; 
			for (var n=1; n<=5; n++) {
				var lengte=parseFloat(obs1lengte);
				lengte=-lengte;
				var breedte=parseFloat(obs1breedte);
				var tijdsduurA=BerekenOvergang(lengte,breedte,parzon);
				var lengte=parseFloat(obs2lengte);
				lengte=-lengte;
				var breedte=parseFloat(obs2breedte);
				var tijdsduurB=BerekenOvergang(lengte,breedte,parzon);
				var rekenverschil=(tijdsduurA-tijdsduurB);
				var parzon=((waarneemverschil/rekenverschil)*parzon);
			}
			var fout=((0.00278/waarneemverschil)*parzon);
			//return values
			form.parallax.value=FormatLD(parzon);
			form.AU.value=(Math.floor(6378.14/((parzon/3600)*rad)));
			form.error.value=Math.abs(FormatLD(fout));
		}
	}


	if (form.method[1].checked) {
	/*
		var tijdA1=HMStoDec(form.tijdstipA1.value);
		var tijdA2=HMStoDec(form.tijdstipA2.value);
		var tijdB1=HMStoDec(form.tijdstipB1.value);
		var tijdB2=HMStoDec(form.tijdstipB2.value);
	*/	
		var tijdA1=UnixToTime(obs1tijd2);
		var tijdA2=UnixToTime(obs1tijd3);
		var tijdB1=UnixToTime(obs2tijd2);
		var tijdB2=UnixToTime(obs2tijd3);
		if (obs1tijd2>0&&obs2tijd2>0) {
			var tijd1=tijdA1;
			var tijd2=tijdB1;
			var fase=2
		}
		if (obs1tijd3>0&&obs2tijd3>0) {
			var tijd1=tijdA2;
			var tijd2=tijdB2;
			var fase=4
		}
		var waarneemverschil=tijd1-tijd2;
		var parzon=8.794148;
		for (var n=1; n<=5; n++) {
			var lengte=parseFloat(obs1lengte)
			lengte=-lengte;
			var breedte=parseFloat(obs1breedte);
			var tijdA=BerekenTijd(lengte,breedte,parzon,fase);
			var lengte=parseFloat(obs2lengte)
			lengte=-lengte;
			var breedte=parseFloat(obs2breedte);
			var tijdB=BerekenTijd(lengte,breedte,parzon,fase);
			var rekenverschil=(tijdA-tijdB);
			var parzon=((waarneemverschil/rekenverschil)*parzon);
		}
		var fout=((0.00278/waarneemverschil)*parzon);
		//return values
		form.parallax.value=FormatLD(parzon);
		form.AU.value=(Math.floor(6378.14/((parzon/3600)*rad)));
		form.error.value=Math.abs(FormatLD(fout));
	}
}