/* To adapt, amend the following lines as appropriate:
 * home air base:	change airport code in Air.js, line "Heimatplatz = APT (<airport code>);"
 * aircraft:		below, add lines like "<code> = new Flz(...);"
 * airports:		add lines in Airports.txt
 * destinations:	in Air.js, add lines like "d = new Dest(...);"
 */

var Slot = new Array();
var Jetzt0 = new Date();
Jetzt = Jetzt0.getHours() + Jetzt0.getMinutes()/100.;

//**********************************
AbTafel = new Array();
AnTafel = new Array();
HeutigerTagesname = new Date();
HeutigerTagesname = HeutigerTagesname.getDay();    // 0=So...
if (HeutigerTagesname == 0) HeutigerTagesname = 7; // 7=So...
//**********************************

// Airport.txt related:
// Longitude may be >180 therefore:
function E_GT_180(East) {return (East>180) ? East-360 : East-0;}
function APT (Code)
{
	Decode = Code.split("#");
	return {name: Decode[0] + ", " + Decode[1], time: Decode[2], b: Decode[3]-0, l: E_GT_180(Decode[4])};
}

function Init(HeimatplatzCode)
{
	function Flz(Typ, Geschwindigkeit, Reichweite, Gesellschaft, Anzahl)
	{
		this.typ    = Typ;
		this.speed  = Geschwindigkeit; // kn
		this.dist   = Reichweite;      // nm
		this.flight = Gesellschaft;
			// FF: Longerath, Smalik, Western Isles and Old Continent
			// RF: Far Eastern Old Continent and New Vexillium
			// AF: Neighbourhood States (AF mainly operates domestic routes)
			// IF: domestic routes
			// RA: (Royal Fenizic Airshipping Company) luxury airship cruises
			// UD: Air-U (AU required by Aij Utani)
			// FR: AERVOJO DE FORA RIFO
			// CI: Cimeran Airlines
			// PC: AirPC (Aerolinnas Portocapitalianas)
			// SF: Schneeflug (Terrablanca, Dascunya)
			// RO: Air Rosardan (Rosardan)
		this.anz    = Anzahl;
			// Die Anzahl der benötigten Flz soll eigentlich unten berechnet werden!
	}
	p20 = new Flz("LAC-200",	282, 1420, "IF", 2); // F50-100
	j51 = new Flz("LAC-510",	500, 2300, "FF", 4); // B737-200
	j30 = new Flz("LAC-3000",	526, 5000, "FF", 4); // B707-320C
	j40 = new Flz("LAC-4000",	523, 5200, "FF", 2); // B747-200B
	j03 = new Flz("K-0330",		464, 3250, "AF", 2); // so bei Klagstein angegeben
	j09 = new Flz("K-0990X",	566, 9020, "RF", 9); // so bei Klagstein angegeben
	                                  // 9020 nm = 16700 km für den "großen Teich"
	zif = new Flz("PAXTON Mark 1",	 69, 5400, "IF", 3); // LZ-127 "Graf Zeppelin"
	//Die wirkliche Vorlage war wohl LZ 120, aber dessen Reichweite reicht nicht: zif = new Flz("PAXTON Mark 1",	 71.5, 918, "IF", 3); // LZ-120 "Bodensee"
	zfr = new Flz("PAXTON Mark 1",	 69, 5400, "FR", 1); // AERVOJO DE FORA RIFO
	//Die wirkliche Vorlage war wohl LZ 120, aber dessen Reichweite reicht nicht: zfr = new Flz("PAXTON Mark 1",	 71.5, 918, "FR", 1); // AERVOJO DE FORA RIFO
	zra = new Flz("Paxton-OFP",	 69, 8900, "RA", 1); // LZ-129plus, siehe "Royal FenizicAirshippingCompany.html"
	p2u = new Flz("LAC-200",	282, 1420, "UD", 0); // Ulnovabad AIR-U
	p2s = new Flz("LAC-200",	282, 1420, "SF-",1); // Schneeflug (Terrablanca, Dascunya)
	j5u = new Flz("LAC-510",	500, 2300, "UD", 0); // AIR-U, Ulnovabad 
	j5r = new Flz("LAC-510",	500, 2300, "RO-",1); // Air Rosardan, A/C B737-200 leased 
	j3r = new Flz("LAC-3000",	526, 5000, "RO-",1); // Air Rosardan, A/C B707-320C leased
	cim = new Flz("Cimeran",	500, 9000, "CI-",0); // Cimera, Typ und Leistung unbekannt
	apc = new Flz("LAC-3000",	526, 5000, "PC-",0); // Porto Capital
	vab = new Flz("VAB 1200-31",	500, 8531, "VM-",0); // Vingarmark, 15800 km
	fb1 = new Flz("NaciaEzo	Hydro",	187, 1120, "FR", 0); // AERVOJO DE FORA RIFO ex NACIA AERVOJO, Grumman Mallard G-73T oder GT 73 (Turbo)
	// zweibuchstabige Gesellschaften (eigene) zeigen auf "Fleets",
	// mehrbuchstabige Gesellschaften (fremde) zeigen auf "Int... calling..."
	xxx = new Flz("error",	1, 1, "zz", 0);

	INTDATELINE = -90; // Grad
	IDL = INTDATELINE / 15;
	GRADINRAD = 0.0174533;

	Heimatplatz = APT (HeimatplatzCode);
	Landesname = Heimatplatz.name.split(", ")[1];

	flugnr_speicher = 0;
	Zeilenfarbe = "b1";
} // Ende Init


// Andere Funktionen
function Vornull(a) {return a = (a<10) ? "0"+a : a}
function Sechzig()  {if (zw2 == 60) {zw1 += 1; zw2 = 0}}
function INMINUTEN(a)
{
	NEXT_DAY = " ";
	while (a > 24) {
		a = a - 24;
		NEXT_DAY = NEXT_DAY + "*";
	}
	NEXT_DAY = (NEXT_DAY > " ") ? NEXT_DAY + ")" : "";
	zw1 = parseInt(a);
	zw2 = Math.round((a-zw1)*60);
	Sechzig();
	return Vornull(zw1) + ":" + Vornull(zw2) + NEXT_DAY;
}
Tageskuerzel = new Array("ohne Null", "Mo", "Tu", "We", "Th", "Fr", "Sa", "Su");
function INMINUTEN_RUNDFLUG(abflugtag, a)
{
	NEXT_DAY_ZAEHLER = 0;
	while (a > 24) {
		a = a - 24;
		NEXT_DAY_ZAEHLER += 1;
	}
	zw1 = parseInt(a);
	zw2 = Math.round((a-zw1)*60);
	Sechzig();
	ankunftstag = Number(abflugtag) + NEXT_DAY_ZAEHLER;
	while (ankunftstag > 7) { ankunftstag = ankunftstag - 7 }
	return Tageskuerzel[ankunftstag] + " " + Vornull(zw1) + ":" + Vornull(zw2);
}
function INMIN_AB_RUECK(a)
{
	zw1 = parseInt(a);
	zw2 = Math.round((a-zw1)*100);
	return Vornull(zw1) + ":" + Vornull(zw2);
}
function IN_DECIMAL(a) // aus Std.Min wieder Std.dezimalen machen
{
	zw1 = Math.floor(a);
	return zw1 + (a-zw1)/.60;
}
function IN_DECIMAL_DOPPELPUNKT(a) // aus Std:Min wieder Std.dezimalen machen
{
	zwArray = a.split(":");
	return zwArray[0] + zwArray[1]/.60;
}


// Jede Zeile/jeder Flug/jede Destination ein Objekt
// Abflug, Rückflug = hh.mm
function Dest(CodeStart, CodeDesti, tage, abflug, rueckflug, bemerkung)
{
start = APT (CodeStart);
desti = APT (CodeDesti);
if (desti.name.split(", ")[1] == Landesname) desti.name = desti.name.split(", ")[0];

abflug_dezimal = parseInt(abflug) + (abflug - parseInt(abflug)) / 0.6;
rueckflug_dezimal = parseInt(rueckflug) + (rueckflug - parseInt(rueckflug)) / 0.6;
distanz = 57.2958 * (Math.acos(Math.sin(GRADINRAD * start.b) * Math.sin(GRADINRAD * desti.b) + Math.cos(GRADINRAD * start.b) * Math.cos(GRADINRAD * desti.b) * Math.cos(GRADINRAD * (desti.l - start.l)))) * 60; // nm

//    Dimensions of the Vexilium planet: (from a message from M.J.Rudolf 10.03.01 16:25)
// 
//    "Edward designed his original planet on a grid where 15° of latitude measured 1,000 
// miles exactly, or 1,609.3440 kilometers. Therefore, Edward's original scale tells us 
// that the planet Vexillium has a circumference of 24,000 miles, or 38,624.256 km."
// 
//    My above calculation for "distanz", however, is independent of the circumference as 
// it recons in radiants, converts the result into degrees (57.2958 [degrees/rad] * rad), 
// then into minutes of arc (degrees * 60 [minutes/degree]) and calls this minute of arc 
// a nautical mile (NM).
// 
//    So "my" nautical mile is not 1.852 kms like on earth but only 1.788 kms which is 
// 3.5% less, and all aircraft based on knots and NM are simply 3.5% slower and their 
// reach is 3.5% shorter, compared to their performance on earth.

zw2  = start.name != Heimatplatz.name;
zw1  = start.name.split(", ")[0]; // via-Angaben ohne Landesnamen
via  = (zw2) ? "<br>via "  + zw1 : "";
via2 = (zw2) ? "<br>"      + zw1 : "";

zw1 = Math.abs(desti.l);
zw2 = Math.abs(start.l);
//function ZONE (l,a) {return parseInt(l/a*(0.5+a/15))} // h
zw3 = desti.time; //ZONE (desti.l, zw1);
zw4 = zw3 - start.time; //ZONE (start.l, zw2);
//zonenzeitdiff = zw4;
zw5 = Math.abs(zw4);
zeit_leg = (zw5 > 12) ? -zw4/zw5 * (24 - zw5) : zw4; // Zonenzeitdiff.
if (zw3 < IDL) {zw3 = 24 + zw3} // so wird die Zeitdifferenz auf das richtige Datum bezogen
Heimatzone = Heimatplatz.time; //ZONE (Heimatplatz.l, Math.abs(Heimatplatz.l));
zeitunterschied = (zw3 != Heimatzone) ? " (" + (zw3 - Heimatzone) + ")" : "";

zw1 = INTDATELINE - start.l;
zw2 = Math.abs(zw1);
zw3 = desti.l - start.l;
zw4 = Math.abs(zw3);
zw5 = zeit_leg/Math.abs(zeit_leg); // Vorzeichen der Zonenzeitdiff.
UEBERFLIEGT_IDL = (zw4 > zw2) && (zw5 == zw1/zw2); // Betrag und Richtung des Längenunterschieds zum Ziel bzw. zur IDL
ZUSCHLAG = (UEBERFLIEGT_IDL) ? -zw5 * 24 : 0; // bei Ueberquerung der IDL Ri. West (zw5 neg.) ein Tag mehr, Ri. Ost ein Tag weniger

zw1 = abflug_dezimal + zeit_leg + ZUSCHLAG;
zw2 = rueckflug_dezimal - zeit_leg - ZUSCHLAG;

fliegzeit = distanz/lfz.speed;
zuweit = (distanz > lfz.dist) ? "<br><font color=red><strong>" + Math.round(distanz - lfz.dist) + "nm too far</strong><font color = black>" : "";


ankunft = zw1 + fliegzeit;
rueckkunft = zw2 + fliegzeit;
zw1 = parseInt(fliegzeit);
zw2 = Math.round((fliegzeit-zw1)*60);
Sechzig();
flieg_zeit = Vornull(zw1) + ":" + Vornull(zw2);

tage = (tage != 0) ? tage+"" : "";
zw1 = "";
gleicherflug = false;
i=0;
while (i<tage.length)
{
	switch (tage.charAt(i)) 
	{
		case "1": zw1 += "Mo"; break;
		case "2": zw1 += "Tu"; break;
		case "3": zw1 += "We"; break;
		case "4": zw1 += "Th"; break;
		case "5": zw1 += "Fr"; break;
		case "6": zw1 += "Sa"; break;
		case "7": zw1 += "Su"; break;
		case "8": zw1 += "<i>suspended</i>"; break;
		case "9": gleicherflug = true; break;
	}
	i++;
}
tagesnamen = zw1;

if ((typeof flugnummer) == "string") {
	flugnummer = Number(flugnummer.substr(1, flugnummer.length-1));
	Rundflug = true;
} else {
	if (flugnummer != flugnr_speicher) Rundflug = false;
}
if (flugnummer != flugnr_speicher) {
	Zeilenfarbe = (Zeilenfarbe == "b1") ? "b2" : "b1";
	flugnr_speicher = flugnummer;
}
zw1 = Math.abs(flugnummer);
zw2 = flugnummer/Math.abs(flugnummer); // Vorz. der fl.nr.
flugnr_hin   = (zw2 > 0) ? zw1 : zw1 + 2 ;
flugnr_rueck = (zw2 < 0) ? zw1 : zw1 + 2 ;
flightno_hin      = lfz.flight + flugnr_hin + ((tagesnamen != "") ? "<br>" + tagesnamen : "");
flightno_rueck    = lfz.flight + flugnr_rueck;
flightno_rundflug = lfz.flight + flugnr_hin;

bemerkung = (Rundflug == true) ? ((bemerkung > "") ? bemerkung : "&nbsp;") : ((bemerkung > "") ? "<br>" + bemerkung : "");

/* if (document.location.href.indexOf("Air.html") >= 0) // nur hier Sprung zu Lfz-Bildern
{
	sprungziel = (lfz.flight.length < 3) ? "The%20fleets" : "International%20airlines";
	lfz_typ = "<a href='javascript:Einblenden(%22" + sprungziel + "%22)'>" + lfz.typ + "</a><br>";
// nicht sinnvoll, besser Bild als lfz.bild ablegen und einblenden
}
else */
{
	lfz_typ = lfz.typ + "<br>";
}

if (Rundflug == true) {
	document.write (
		"</td></tr><tr class=", Zeilenfarbe, "><td align='center'>", flightno_rundflug, 
		"</td><td>", start.name, 
		"</td><td align='center'>", tagesnamen, " ", INMIN_AB_RUECK(abflug), 
		"</td><td align='center'>", (flieg_zeit.replace(/:/, "h")).replace(/\b0/, ""), 
		"</td><td>", desti.name, zeitunterschied, 
		"</td><td align='center'>", INMINUTEN_RUNDFLUG(tage, ankunft), zuweit, 
		"</td><td>", bemerkung
	);
} else { /* normaler Flug */
	document.write (
		"</td></tr><tr class=", Zeilenfarbe, "><td>", desti.name, zeitunterschied, via, 
		"</td><td>", flightno_hin, bemerkung, 
		"</td><td>", INMIN_AB_RUECK(abflug), via2, 
		"</td><td>", INMINUTEN(ankunft), zuweit, 
		"</td><td>", flightno_rueck, 
		"</td><td>", INMIN_AB_RUECK(rueckflug), 
		"</td><td>", INMINUTEN(rueckkunft), via2, 
		"</td><td>", lfz_typ, flieg_zeit
	);
}

if (via == "" && lfz.typ.indexOf("PAXTON") < 0) // Luftschiffe landen nicht auf RWY, daher kein Slot noetig
{
	Slot[Slot.length] = (INMIN_AB_RUECK(abflug) + " &nbsp; " + flugnr_hin   + " &nbsp; " + tagesnamen);
	Slot[Slot.length] = (INMINUTEN(rueckkunft)  + " &nbsp; " + flugnr_rueck + " &nbsp; " + tagesnamen);//Diese Tagesnamen stimmen nicht!!
}

//**********************************
// ** Abflugtafel **

// 4 Fälle: Heimatplatz == start -> abflug in AbTafel, rueckkunft in AnTafel
//          Heimatplatz == desti -> rueckflug in AbTafel, ankunft in AnTafel (kommt z.Z. nur 2x vor)
// Rückflug muss richtig ausgerechnet werden!! Abflugtag ist meist =/= Ankunftstag!!
// Muss - sobald gelöst - auch bei der Slot-Berechnung berücksichtigt werden!!!!

function LTDiff(a)
{
	while (a > 24)
	{
		a = a - 24;
		Landetag = Landetag + 1;
	}
	// eigentlich muss berechnet werden: angegebener Abflugtag und -Uhrzeit, Flugzeit (-> evtl. x Tage mehr), Abfluguhrzeit, Flugzeit!
	// im ersten Ansatz sollte einfach "täglich" gerechnet werden!
	return Landetag
}

Landetag = HeutigerTagesname; // 1-7
Flugges = lfz.flight.substr(0,2);
if (Heimatplatz.name == start.name) 
{
	//Landetag = LTDiff(rueckkunft); //So einfach ist das leider nicht!!
	if (via == "" && (tage == "" || tage == "0" || tage.indexOf(HeutigerTagesname) >= 0))
	{ AbTafel[AbTafel.length] = INMIN_AB_RUECK(abflug) + "&nbsp;oo&nbsp;" + Flugges + flugnr_hin + " " + desti.name; }
	if (via == "" && Landetag ==  HeutigerTagesname)
	{ AnTafel[AnTafel.length] = (INMINUTEN(rueckkunft)  + "&nbsp; &nbsp; " + Flugges + flugnr_rueck + " " + desti.name); }
// auch für Landetag + 1 berechnen?!
}
else if (Heimatplatz == desti)
{
	//Landetag = LTDiff(ankunft);
	//Landetag = LTDiff(rueckkunft);
	if (via == "" && (tage == "" || tage == "0" || tage.indexOf(HeutigerTagesname) >= 0))
	{ AbTafel[AbTafel.length] = (INMIN_AB_RUECK(rueckflug) + " " + Flugges + flugnr_hin   + " " + start.name); }
	if (via == "" && Landetag ==  HeutigerTagesname)
	{ AnTafel[AnTafel.length] = (INMINUTEN(ankunft)        + " " + Flugges + flugnr_rueck + " " + start.name); }
}
// ** Ende Abflugtafel **
//**********************************
} // Ende Dest

function TafelZeit()
{
	Jetzt0 = new Date();
	Jetzt = Jetzt0.getHours() + Jetzt0.getMinutes()/100.;
	document.getElementById("TafelZeitZelle").firstChild.data = INMIN_AB_RUECK(Jetzt);

	TafelNeuBerechnen();
	window.setTimeout("TafelZeit()", 60000); // 1 Minute
}

function TafelNeuBerechnen()
{
	JetztB  = IN_DECIMAL(Jetzt);
	AbTafel = AbTafel.sort();
	TeileTabelle = 0;
	for (i=0; i<AbTafel.length; i++)
	{
		AbTafelElement = AbTafel[i].split("&nbsp;"); abflug = Number(AbTafelElement[0].replace(/:/, "."));

		abflugB = IN_DECIMAL((abflug < 1) ? abflug + 24 : abflug);
		if (abflugB <= JetztB) TeileTabelle++;
		Blink = '<img src="Air/dark.gif">';
		if (abflugB-.25 <= JetztB && JetztB < abflugB)     Blink = '<img src="Air/red_ani.gif">';
		if (abflugB-.50 <= JetztB && JetztB < abflugB-.25) Blink = '<img src="Air/green_ani.gif">';
		AbTafel[i] = INMIN_AB_RUECK(abflug) + "&nbsp;" + Blink + "&nbsp;" + AbTafelElement[2];
	}
	AbTafelUnten = AbTafel.slice(0, TeileTabelle+1);
	AbTafelOben  = AbTafel.slice(TeileTabelle+1, AbTafel.length);
//alert(AbTafelUnten.join("<br>"));
	AbTafelNeu = AbTafelOben.concat(AbTafelUnten);
	document.getElementById("TafelListenZelle").innerHTML = AbTafelNeu.join("<br>");
}

function Einblenden(zel)
{
	AllesAndereAusblenden();
	document.getElementById(zel).style.display = "block";
}

function AllesAndereAusblenden()
{
	Alles = document.getElementById("Wechselnd").firstChild.childNodes;
	for (i=0; i<Alles.length; i++)
	{
		Alles[i].firstChild.style.display = "none";
	}
}

function ViewSlots()
{
	Slot.sort();
	slotwindow = window.open("", "Slots", "width=200, scrollbars=1, toolbar=0, locationbar=0, menubar=0");
	slotwindow.document.write
	(
		"<html><head><title>Fenizabad Intl Slots</title></head>",
		"<font face='Arial' size='1'>",
		"Standard slots are assigned every 15 minutes.",
		"These slots are already occupied:<br>",
		"<i>Time - Flight - Days</i><br>",
		Slot.join("<br>"),
		"<p align=center><a href='javascript:window.close()'>close</a></p>",
		"</html>"
	)
}
