/* ------------------------------------------------------------------

File:		flightmap.js
Abstract:	main file; application loading; type selector and marker-list
Version:	0.12
Author:		Pascal Dreer

------------------------------------------------------------------ */


var gXml;
var gMap;
var gMPDisplayList; 

var gConfigShowMetar = false;
var gConfigShowPublicMarker = false;
var gConfigShowCH1903 = true;
var gConfigShowAirspace = true;


function load() 
{	
	resizeApp();
	if (GBrowserIsCompatible()) {
		gMap = new GMap2(document.getElementById("map"));
		gMap.addControl(new GLargeMapControl());
		gMap.addControl(new GMapTypeControl());
		gMap.addMapType(G_PHYSICAL_MAP);
		gMap.addControl(new GOverviewMapControl());
		gMap.addControl(new GScaleControl());
        gMap.setCenter(new GLatLng(46.68,8.13),8);
		 
		gMap.setMapType(G_PHYSICAL_MAP);
		 
		initUserIcon();
		
		loadDefaultMappoints();

		for (var j = 1; j < 9; j++) {
			gTypeSelector[j] = false;
		}
		
		gTypeSelector[1] = true;
		document.getElementById('sel1').checked = true;
		gTypeSelector[2] = true;
		document.getElementById('sel2').checked = true;
		
		document.getElementById('sel3').checked = false;
		document.getElementById('sel4').checked = false;
		document.getElementById('sel5').checked = false;
		document.getElementById('sel6').checked = false;
		document.getElementById('sel7').checked = false;
//		document.getElementById('sel8').checked = false;
		document.getElementById('sel9').checked = false;
		
	}
	else {
		alert("Not browser compatible.");
	}
}



function loadDefaultMappoints()
{
	document.getElementById("list").innerText = "";
	
	GDownloadUrl("data.xml",function(data, responseCode) {
		gXml = GXml.parse(data);
		var markers = gXml.documentElement.getElementsByTagName("marker");
		for (var i = 0; i < markers.length; i++) {
			var mp = new Mappoint(markers[i].getAttribute("id"),markers[i].getAttribute("code"),markers[i].getAttribute("lat"),markers[i].getAttribute("lng"),markers[i].getAttribute("name"),
									markers[i].getAttribute("area"),markers[i].getAttribute("desc"),markers[i].getAttribute("type"),markers[i].getAttribute("elev"),markers[i].getAttribute("urlRef"),
									markers[i].getAttribute("urlData"),markers[i].getAttribute("country"));

			gMarkers[i] = createMarker(mp,i,false);
			gMap.addOverlay(gMarkers[i]);
									
			gMappoints.push(mp);
		}

		initAirspace();
		loadMPList();
		displayMPList();
		sortListByType();
		resizeApp();
		initRouting();
		initUser();
		initPrefs();
		showInfoDisplay();
		
		
		if (gConfigShowMetar)
			startMetarInterval();
	});
}


function loadUserMappoints(data)
{
		gXml = GXml.parse(data);
		var markers = gXml.documentElement.getElementsByTagName("marker");
		for (var i = 0; i < markers.length; i++) {
			var mp = new Mappoint(markers[i].getAttribute("id"),markers[i].getAttribute("code"),markers[i].getAttribute("lat"),markers[i].getAttribute("lng"),markers[i].getAttribute("name"),
									markers[i].getAttribute("area"),markers[i].getAttribute("desc"),markers[i].getAttribute("type"),markers[i].getAttribute("elev"),markers[i].getAttribute("urlRef"),
									markers[i].getAttribute("urlData"),markers[i].getAttribute("country"));


			
			gMappoints.push(mp);
			gUserMarkerID++;
			var num = gMappoints.length-1;
			
//			if (mp.type == 9) {
	//			createUserMarker(mp);
		//	}
//			else {
				gMarkers.push(createMarker(mp,num,true));
				gMap.addOverlay(gMarkers[num]);
				addToMPList(num,9,markers[i].getAttribute("name"),markers[i].getAttribute("area"));
//			}
			
										
		}
		
		gTypeSelector[9] = true;
		document.getElementById('sel9').checked = true;	
		showUserControls();	
		displayMPList();
	//	sortListByType();
}



	
	

function loadMPList()
{
	gMPDisplayList = new Array();
	for (var i = 0; i < gMappoints.length; i++) {
		var obj = new Object();
		obj.mpid = i;
		obj.id = gMappoints[i].id;
		obj.type = gMappoints[i].type;
		obj.name = gMappoints[i].name;
		obj.area = gMappoints[i].area;
		obj.toString = tos;	
		gMPDisplayList.push(obj);
		
	}
}



function addToMPList(num,type,name,area)
{
	var obj = new Object();
	obj.mpid = num;
	obj.id = 0;
	obj.type = type;
	obj.name = name;
	obj.area = area;
	obj.toString = tos;	
	gMPDisplayList.push(obj);
//	alert(gMPDisplayList.length);
}



function removeFromMPList(num)
{
	for (var i = 0; i < gMPDisplayList.length; i++) {
		if (gMPDisplayList[i].mpid == num) {
			delete gMPDisplayList[i];
//			gMPDisplayList.slice(i);
			gMPDisplayList[i] = null;
			break;
		}
	}
//	alert(gMPDisplayList.length);
}


function editInMPList(num,type,name,area)
{
	for (var i = 0; i < gMPDisplayList.length; i++) {
		if (gMPDisplayList[i].mpid == num) {
			gMPDisplayList[i].type = type;
			gMPDisplayList[i].name = name;
			gMPDisplayList[i].area = area;
			break;
		}
	}
}





function displayMPList()
{
	var infoWindow = gMap.getInfoWindow();
	if (!infoWindow.isHidden())
		infoWindow.hide();

	document.getElementById("list").innerHTML = "";
	var txt = "<table border='0' width='212' cellpadding='0' cellspacing='1'>";

	for (var i = 0; i < gMPDisplayList.length; i++) {
		if (gMPDisplayList[i]) {
			if ((gTypeSelector[1] && gMPDisplayList[i].type == "1") || (gTypeSelector[2] && gMPDisplayList[i].type == "2") || 
				(gTypeSelector[3] && gMPDisplayList[i].type == "3") || (gTypeSelector[4] && gMPDisplayList[i].type == "4") ||
				(gTypeSelector[5] && gMPDisplayList[i].type == "5") || (gTypeSelector[6] && gMPDisplayList[i].type == "6") ||
				(gTypeSelector[7] && gMPDisplayList[i].type == "7") || (gTypeSelector[8] && gMPDisplayList[i].type == "8") || (gTypeSelector[9] && gMPDisplayList[i].type == "9")) {

				gMarkers[gMPDisplayList[i].mpid].show();
				
				if (gConfigShowMetar && (gMPDisplayList[i].type == 1 || gMPDisplayList[i].type == 2 || gMPDisplayList[i].type == 9)) {
					if (gMappoints[gMPDisplayList[i].mpid].flightrule.length > 0)
						var flightruleImg = "<img src ='images/mm_" + gMappoints[gMPDisplayList[i].mpid].flightrule.toLowerCase() + ".png'> ";
					else
						var flightruleImg = "";
				}
				else 
					var flightruleImg = "";
				
				txt += "<tr><td align='left' width='22' valign='top'><img src='images/icon" + gMPDisplayList[i].type + ".png'></td><td width='140'><a href='javascript:myclick(" + 
						gMPDisplayList[i].mpid + ")'>" + gMPDisplayList[i].name + "</a> " + flightruleImg + "</td><td valign='top' width='30'>" + gMPDisplayList[i].area + "</td></tr>";
			}
			else {
				gMarkers[gMPDisplayList[i].mpid].hide();
			}
		}
	}
	txt += "</table>";
	document.getElementById("list").innerHTML = txt;

	
}





function resizeApp() 
{
		var offsetTop = 0;
		var offsetLeft = 0;
		var mapElem = document.getElementById("map");
		for (var elem = mapElem; elem; elem = elem.offsetParent) {
			offsetTop += elem.offsetTop;
			offsetLeft += elem.offsetLeft;
		}
		var height = getWindowHeight() - offsetTop - 10;
		var width = getWindowWidth() - offsetLeft - 10;
		if (height >= 0) {
			mapElem.style.height = height + "px";
			mapElem.style.width = width + "px";
			document.getElementById("list").style.height = (height - 135) + "px";

//			e("wpanel").style.height =e("panel").style.height = (height + 4) + "px";
	//		e("paneltoggle").style.paddingTop = (height/2) + "px";
		//	e("paneltoggle").style.paddingBottom = (height/2) + "px";
//			var sp = e("spsizer");
	//		sp.style.height = Math.max(0, height - sp.offsetTop) + "px";
		}
		
}

function getWindowHeight() 
{
	if (window.self && self.innerHeight) {
		return self.innerHeight;
	}
	if (document.documentElement && document.documentElement.clientHeight) {
		return document.documentElement.clientHeight;
	}
	return 0;
}


function getWindowWidth() 
{
	if (window.self && self.innerWidth) {
		return self.innerWidth;
	}
	if (document.documentElement && document.documentElement.clientWidth) {
		return document.documentElement.clientWidth;
	}
	return 0;
}



function cb_selector(type)
{
	gTypeSelector[type] = document.getElementById('sel' + type).checked;

	displayMPList();
	
	if (type == 9)
		if (gTypeSelector[9])
			showUserControls();	
		else
			hideUserControls();
}





function cb_selectorLabel(type)
{
	var element = document.getElementById('sel' + type);
	element.checked = !element.checked;
	cb_selector(type);
}



function changed_input(num)
{
	switch (parseInt(num,10)) {
		case 1: gGS = document.getElementById("form_gs").value;	break;
		case 2: gFuelConsumption = document.getElementById("form_fuel").value;	break;
		
		default: ;				 
	}
}




function openWinDisclaimer()
{
	var width = 400;
	var height = 450;
	
	var winLeft = (getWindowWidth() / 2) - (width / 2);
	
	simpleWindow = window.open("disclaimer.html","","width=" + width + ",height=" + height + ",left=" + winLeft + ",top=70,scrollbars=yes");
	simpleWindow.focus();
}


function openWinHelp()
{
	var width = 500;
	var height = 500;
	
	var winLeft = (getWindowWidth() / 2) - (width / 2);
	
	simpleWindow = window.open("help.html","","width=" + width + ",height=" + height + ",left=" + winLeft + ",top=70,scrollbars=yes");
	simpleWindow.focus();
}

 
 
 
function openSimpleWin(filename,width,height)
{	
	var winLeft = (getWindowWidth() / 2) - (width / 2);
	
	simpleWindow = window.open(filename,"","width=" + width + ",height=" + height + ",left=" + winLeft + ",top=70,scrollbars=yes");
	simpleWindow.focus();
}



function showInfoDisplay()
{
	var today = new Date();
	var todayStr = today.getFullYear() + String(((today.getMonth()+1) < 10) ? "0" + (today.getMonth()+1) : (today.getMonth()+1)) + String((today.getDate() < 10) ? "0" + today.getDate() : today.getDate());
	today.setTime(today.getTime() + (24 * 60 * 60 * 1000));
	var tomorrowStr = today.getFullYear() + String(((today.getMonth()+1) < 10) ? "0" + (today.getMonth()+1) : (today.getMonth()+1)) + String((today.getDate() < 10) ? "0" + today.getDate() : today.getDate());

	var kosifToday = "http://www.skyguide.ch/de/AIMServices/AicKosifVfrBulletin/_Kosif_Karten/KOSIF_Karte_" + todayStr + ".pdf";
	var kosifTomorrow = "http://www.skyguide.ch/de/AIMServices/AicKosifVfrBulletin/_Kosif_Karten/KOSIF_Karte_" + tomorrowStr + ".pdf";
	document.getElementById("infoDisplayDiv").innerHTML = "<a href='" + kosifToday + "' target='_blank'>KOSIF Today</a><br><a href='" + kosifTomorrow + "' target='_blank'>KOSIF Tomorrow</a>";
}



// -----------------------------------------------------------
// Handle Sorting
// -----------------------------------------------------------


function sortListByType()
{
	order = "type";
	gMPDisplayList.sort(cmpnum);
	displayMPList();
}

function sortListByName()
{
	order = "name";
	gMPDisplayList.sort();
	displayMPList();
}

function sortListByArea()
{
	order = "area";
	gMPDisplayList.sort(cmpnum);
	displayMPList();
}


var order = "";
function tos() 
{
	switch (order) {
		case "name":
			return this.name;
		case "area":
			return this.area;
		case "type":
			return this.type;
	
		default:
			return this.type;
	}
}


function cmpnum(val1,val2) 
{
	switch (order) {
		case "type":
			if (val1.type == val2.type) {
				var ch0 = val1.name.charCodeAt(0) - val2.name.charCodeAt(0);
				if (ch0 != 0)
					return ch0;
				else
					return val1.name.charCodeAt(1) - val2.name.charCodeAt(1);
				
			}
			return val1.type - val2.type;
		break;
		
		case "area":
			if (val1.area == "")
				return -1;
			if (val2.area == "")
				return 1;
			
			
			if (val1.area == val2.area) {
				var ch0 = val1.name.charCodeAt(0) - val2.name.charCodeAt(0);
				if (ch0 != 0)
					return ch0;
				else
					return val1.name.charCodeAt(1) - val2.name.charCodeAt(1);
				
			}
			var ch0 = val1.area.charCodeAt(0) - val2.area.charCodeAt(0);
			if (ch0 != 0)
				return ch0;
			else
				return val1.area.charCodeAt(1) - val2.area.charCodeAt(1);
			
			break;
		default:
			return 0;
	}
}


// *****************************************************************************************************
// MISC
// *****************************************************************************************************






function randomizeURL(url) 
{ 
        return url + ((url.indexOf('?') != -1) ? '&rnd=' : '?rnd=') + Math.floor(Math.random() * 99999); 
} 




function convertFtToM(ft)
{
	return Math.round(parseInt(ft,10) * 0.3048);
}


function roundNumber(num,dig)
{
	var n = Math.pow(10,dig);
	var m = Math.round(num * n) / n;
	return m;
}



function wgsLatToSwiss(lng,lat)
{
	
	var ea = (lat - 7.43863) / 57.2957795;
	var na = (lng - 46.95108) / 57.2957795;
	
	return roundNumber(600 + 1841.627 * ea + 2520.1147 * Math.sin(ea) - 4654.4 * ea * na,3);
}


function wgsLngToSwiss(lng,lat)
{
	var ea = (lat - 7.43863) / 57.2957795;
	var na = (lng - 46.95108) / 57.2957795;

	
	
	return roundNumber(200 + 6369.76 * Math.sin(na) + 1591.87 * ea * ea * (1-na / 0.91) + 23.9 * na * na,3);
	
}


function swissToWgsLat(x,y)
{
	var xb = x - 600.000;
	var yb = y - 200.000;
	
	
	return 46.95108 + yb / 111.18143955 - xb * xb / 1332636;
}


function swissToWgsLng(x,y)
{
	var xb = x - 600.000;
	var yb = y - 200.000;

	return 7.43863 + 57.29577951 * Math.atan(xb / 4360.68 + xb * yb / 26378264);
}


function convertBooleanToInt(val)
{
	if (val == "")
		return "";
		
	if (val)
		return 1;
	else 
		return 0;
}