	// some global objects
	myLastQuery = myRoute = null;
	myAllNotams = null;
	myZoomToRoute = false;
	myRoute = null; // die globale Route für die Karte, wird hier instanziert/"lebt" hier...
	
	// KL, basic notam query, called with prepared query
	function requestNotam( query, txtCallsign, setinputField ) 
	{
		setStatusMsg ("Übertrage NOTAMS...");
		enableFields(false);
		if (setinputField ) {
			dojo.byId("routetext").value = query;
		}
		var txtUrl = "scripts/getnotamjson.php?"+ "call_sign=" + encodeURIComponent(txtCallsign) + 
									"&" + "query=" + encodeURIComponent(query) + 
									"&" + "rand=" + encodeURIComponent(rand(1000));

		dojo.xhrGet({
			url: txtUrl,
			load: function(data){ NotamsReceived(data); },
			error: function(error){ 
				myAllNotams = null;
				enableFields(true);
				ShowError(error); 
			},
			handleAs: "json"
		});
	}

	function NotamsReceived(thisQuery) 
	{
		setStatusMsg ("receiving NOTAM query ...");

		myAllNotams = thisQuery;
		myAllNotams.notams = thisQuery.notams.sort(sortNotamsByLfdr);
		
		var Query = thisQuery;
		
		// KL, save last query for callbacks
		myLastQuery = Query;

		showNotamPane();

		var divQueryData = dojo.byId('queryData');
		
		// KL, clear notam list (left pane)
		clearNotamList();

		if ( Query && Query.notams ) {

			// set result info fields
			divQueryData.style.visibility = 'visible';
			dojo.byId("queryInput").innerHTML = Query.info.querystr;
			if ( Query.info.routestr ) {
				dojo.byId("queryRoute").innerHTML = Query.info.routestr;
			} else {
				dojo.byId("queryRoute").innerHTML = "-";
			}
			dojo.byId("querySearchRadius").innerHTML = Query.info.radius;
			dojo.byId("queryDBDate").innerHTML = Query.info.publicationtimestamp;
			dojo.byId("queryDate").innerHTML = Query.info.created;
			if ( Query.info.validdate ) {
				dojo.byId("validDate").innerHTML = Query.info.validdate;
			} else {
				dojo.byId("validDate").innerHTML = "keine Einschränkung";
			}
		
			// sort items by scope
			var sortedItems = Query.notams.sort(sortNotamsByScope);
			var curGroup = "XX";
			dojo.forEach(sortedItems, 
				function(Notam) {
					
					// KL, plain view only
					var scope = Notam.scope;
					if ( curGroup != scope ) {
						// add header to group
						if ( scope == 'W' ) {
							addGroupHeader ('Warnungen');
						} else if ( scope == 'A' ) {
							addGroupHeader ('Flugplätze');
						} else if ( scope == 'AE' || scope == 'AW') {
							addGroupHeader ('Flugplätze/Enroute');
						} else if ( scope == 'E' ) {
							addGroupHeader ('Enroute');
						} else {
							addGroupHeader ('Gruppe: ' + scope);
						}
						curGroup = scope;
					}
					
					addNotam(Notam, 'notamsPlain');
				}
			);
			
			// map update
			var myNotamLayer = initNOTAMLayer(glbMap);
			myNotamLayer.clear();
			var curLocation = 0;
			dojo.forEach(myAllNotams.notams, 
				function(Notam) {
					var idLocation = parseInt(Notam.lfdnr);
					if ( curLocation != idLocation ) {
						myNotamLayer.addNotam(Notam, false);
						curLocation = idLocation;
					}
				}
			)
			myNotamLayer.refresh();
			
		}
		
		// KL, plain view
		if ( sortedItems.length == 0) {
			addEmptyItem('notamsPlain');
		}
		
		// Hajo: Route chainen
		if (!myRoute) myRoute = new VFRRoute(glbMap);
		myRoute.load(Query.route, myZoomToRoute, 'routePlain');
		
		enableFields(true);
		ClearError();
	}
	
	function sortNotamsByScope(a,b)
	{
		if ( a.scope > b.scope ) {
			return -1;
		} else if ( a.scope < b.scope ) {
			return 1;
		} else {
			return 0;
		}
	}

	function sortNotamsByLfdr(a,b)
	{
		if ( parseInt(a.lfdnr) < parseInt(b.lfdnr) ) {
			return -1;
		} else if ( parseInt(a.lfdnr) > parseInt(b.lfdnr) ) {
			return 1;
		} else {
			return 0;
		}
	}
	
	function addEmptyItem( paneName )
	{
		var newNotam = createElement('div', 'notamItem');

		var newNotamTitle = createElement('div', 'notamBodyAltert');
		newNotamTitle.innerHTML = "<p>Für Ihre Eingabe wurden keine NOTAM gefunden.</p><p>Trennen Sie Wegpunkte durch einen '-' oder sorgen Sie dafür, das Start- und Zielpunkt der Route erkannt werden.</p>";
		newNotam.appendChild(newNotamTitle);

		document.getElementById(paneName).appendChild(newNotam);
	}

	function addNotam(Notam, paneName) 
	{
		var newNotam = createElement('div', 'notamItem', 'onClick="javascript:centerNotamOnMap(this);"');
		newNotam.setAttribute('onClick', 'javascript:centerNotamOnMap(this);');

		newNotam.id = Notam.key;
		newNotam.latitude = Notam.lat;
		newNotam.longitude = Notam.lon;
		newNotam.lfdnr = Notam.lfdnr;
		
		var newNotamTitle = createElement('div', 'notamtitle');
		newNotamTitle.innerHTML = Notam.number + "&nbsp;" + Notam.locator + "&nbsp;" + Notam.qcodedecoded;
		newNotam.appendChild(newNotamTitle);
		
		var newNotamBody = createElement('div', 'notambody');

		var nText = Notam.fromto + "<br/>" + Notam.body;
		if ( Notam.locationname ) {
			nText = Notam.locationname + '<br/>' + nText;
		}
		newNotamBody.innerHTML = nText;
		newNotam.appendChild(newNotamBody);
		document.getElementById(paneName).appendChild(newNotam);
	}

	// KL: add a header item to the ungrouped notam list
	function addGroupHeader ( header ) 
	{
		var newNotam = createElement('div', 'notamGroupHeader');
		newNotam.innerHTML = header;
		document.getElementById('notamsPlain').appendChild(newNotam);
	}
	
	function centerNotamOnMap(notamdiv) 
	{
		var myNotamLayer = initNOTAMLayer(glbMap);
		myNotamLayer.centerNotamOnMap ( notamdiv.lfdnr );
	}
	
	function clearNotamList() 
	{
		// KL remove, ungrouped results
		var results = dojo.byId('notamsPlain');
		while (results.firstChild)  {
			results.removeChild(results.firstChild);
		}
	}

/*	
	// build initial map display with all NOTAM
	function requestAllNotams() 
	{
		enableFields(false);
		setStatusMsg ("Initialisiere NOTAM...");
		dojo.xhrGet({
			url: "scripts/getnotamjson.php?query=NOF:*",
			load: function(data){ allNotamsReceived(data); },
			error: function(error){ ShowError(error); },
			handleAs: "json"
		});
	}

	// returns all notams in DB
	function allNotamsReceived ( Query ) 
	{
		setStatusMsg ("Antwort erhalten NOTAM...");
		myAllNotams = Query;
		setStatusMsg ("before sort");
		myAllNotams.notams = Query.notams.sort(sortNotamsByLfdr);
		setStatusMsg ("before init");
		var myNotamLayer = initNOTAMLayer(glbMap);
		myNotamLayer.clearSelection();
		setStatusMsg ("after sort and init");
		
		// KL, for each location create one item on the map
		var curLocation = 0;
		if ( Query && Query.notams ) {
			dojo.forEach(myAllNotams.notams, 
				function(Notam) {
					var idLocation = parseInt(Notam.lfdnr);
					if ( curLocation != idLocation ) {
						myNotamLayer.addNotam(Notam, false);
						curLocation = idLocation;
					}
				}
			)
			setStatusMsg ("before refresh");
			myNotamLayer.refresh();
		}

		enableFields(true);
		
		// das gemeinsame NOTAM-Overlay erst jetzt laden, nicht schön, aber performanter ....
		setStatusMsg ("before loadNotamLayer");
//		loadNotamLayer(glbMap);
		setStatusMsg ("after loadNotamLayer");
		
		setStatusMsg ("");
		
	}
*/

	function RequestPointInfo(lat, lon, scale) 
	{
		dojo.xhrGet({
			url: "scripts/getpointjson.php?lat="+lat+"&lon="+lon+"&scale="+scale,
			load: function(data){ PointInfoReceived(data); },
			error: function(error){ ShowError(error); },
			handleAs: "json"
		});
	}

	function PointInfoReceived(pointinfo) 
	{
		var myval;
		myval = 	document.getElementById("routetext").value 
		if (myval.length>0) 
			document.getElementById("routetext").value = myval + "-" + pointinfo.point;
		else
			document.getElementById("routetext").value = pointinfo.point;
		// und fetchen:
		requestNotamFromForm(false);
	}

	
		function cnvLatLng2FP ( x, gradDezimals )
		{
			// 510702N 084006E
			var xx = Math.abs(x);
			
			var grad = Math.floor(xx);
			var fract = xx - grad;
			
			var min = Math.floor(fract * 60.0);
			var sec = Math.floor((fract - min/60.0)*3600.0);
			
			
			return zeroPad(grad, gradDezimals) + zeroPad(min,2) + zeroPad(sec,2);
		}
		

		function cnvCoord2FP ( lat, lng )
		{
			return cnvLatLng2FP(lat, 2) + "N" + cnvLatLng2FP(lng, 3) + "E";
		}
	
	
	var locationReqestInProgress = false;
	var infoLat = 0;
	var infoLon = 0;
	var infolatlng1 = null;
	// request notam at given location
	function RequestLocationInfo(lat, lon) 
	{
		if ( locationReqestInProgress == true ) {
			return;
		}
		locationReqestInProgress = true;
		infoLat = lat;
		infoLon = lon;
		infolatlng1 = new GLatLng(infoLat, infoLon);
		
		var query = cnvCoord2FP(lat, lon) + ";Radius=5km"
		var txtUrl = "scripts/getnotampoint.php?query=" + encodeURIComponent(query) + 
									"&" + "rand=" + encodeURIComponent(rand(1000));
		dojo.xhrGet({
			url: txtUrl,
			load: function(data){ LocationInfoReceived(data); },
			error: function(error){
				locationReqestInProgress = false;
				ShowError(error); 
			},
			handleAs: "json"
		});
	}

	function sortNotamsByDistance(a,b)
	{
		var glatlng1 = new GLatLng(a.lat, a.lon);
		var glatlng2 = new GLatLng(b.lat, b.lon);
	
		var d1 = infolatlng1.distanceFrom(glatlng1);
		var d2 = infolatlng1.distanceFrom(glatlng2);
	
		if ( d1 < d2 ) {
			return -1;
		} else if ( d1 > d2 ) {
			return 1;
		} else {
			return 0;
		}
	}
	
	function LocationInfoReceived(query) 
	{
		locationReqestInProgress = false;
		if ( query && query.notams ) {

			// remove NOTAM with large influence radius...
			var filteredNotams = new Array();
			for ( var i=0; i<query.notams.length; i++) {
				var glatlng = new GLatLng(query.notams[i].lat, query.notams[i].lon);
				var d1 = infolatlng1.distanceFrom(glatlng);
				if ( d1 < 10000 ) {
					filteredNotams.push (query.notams[i] );
				}
			}
			query.notams = filteredNotams;
			query.notams = query.notams.sort(sortNotamsByDistance);
		
			var myNotamLayer = initNOTAMLayer(glbMap);
			myNotamLayer.showNOTAMInfo (infoLat, infoLon, query);

		}
		
	}

