var screenAirportMain = {
    pos: nil,
    apt_coord: nil,
    apt: nil,
    searched: 0,
    oaci: nil,
    search: func {
	me.apt = me.oaci != nil ? airportinfo(me.oaci) : airportinfo();
	if (me.apt != nil) {
	    #glide_slope_tunnel.complement_runways(me.apt);
	    return 1;
	}
	else
	    return 0;
    },
    right : func {
    },
    enter : func { #add to route
	add_waypoint(me.apt.id, me.apt.name, "APT", 
		    [me.apt_coord.lat(), me.apt_coord.lon(), 
		    me.apt_coord.alt()*alt_conv[1][0]]);
    },
    escape : func {
	me.searched = 0;
	me.oaci = nil;
    },
    start : func {  #add bookmark, enter turnpoint mode
	add_bookmark(me.apt.id, me.apt.name, "APT", 
		    [me.apt_coord.lat(), me.apt_coord.lon(), 
		    me.apt_coord.alt()*alt_conv[1][0]]);
	screenTurnpointSelect.selected = screenTurnpointSelect.n - 1;
	screenTurnpointSelect.start();
    },
    lines : func {
	if (me.search() == 1) { #FIXME: THE SEARCH SHOULD BE DONE ONLY ONE TIME, 
				#       BUT IT SEEMS TO BE EXECUTED 3 TIMES/SEC
				#       I DON'T KNOW YET WHY... :/
	    var rwy = glide_slope_tunnel.best_runway(me.apt);
	    me.pos = geo.Coord.new(geo.aircraft_position());
	    me.apt_coord = geo.Coord.new().set_latlon(rwy.lat, rwy.lon);
	    var ac_to_apt = [me.pos.distance_to(me.apt_coord), me.pos.course_to(me.apt_coord)];
	    var ete = ac_to_apt[0] / getprop("instrumentation/gps/indicated-ground-speed-kt") * 3600 * 1852;
	    display([
	    sprintf("%s APT: %s", me.searched != 0 ? "SEARCHED" : "NEAREST", me.apt.id),
	    sprintf("ELEV: %d %s", me.apt.elevation * alt_conv[1][alt_unit],alt_unit_short_name[alt_unit]),
	    sprintf("DIST: %d %s",ac_to_apt[0] * dist_conv[2][dist_unit],dist_unit_short_name[dist_unit]),
	    sprintf("BRG: %d°    RWY: %02d",ac_to_apt[1], int(rwy.heading) / 10),
	    sprintf("ETE: %s",seconds_to_string(ete))
	    ]);
	}
	else
	    display([
	    "",
	    " ! ERROR !",
	    "NO  AIRPORT",
	    "   FOUND",
	    ""
	    ]);
    }
};

var screenAirportInfos = {
    page : 0,
    rwylist: [],
    right : func {
	np = int(size(me.rwylist) / 4) + (math.mod(size(me.rwylist),4) ? 1 : 0);
	me.page = cycle(np, me.page, arg[0]);
    },
    enter : func {
    },
    escape : func {
    },
    start : func {
    },
    lines : func {
	me.rwylist = [];
	foreach (var r; keys(screenAirportMain.apt.runways)) {
	    string.isdigit(r[0]) or continue;
	    var number = math.mod(num(substr(r, 0, 2)) + 18, 36);
	    var side = substr(r, 2, 1);
	    var comp = sprintf("%02d%s", number, side == "R" ? "L" : side == "L" ? "R" : side);
	    append(me.rwylist, [r, comp, 
				screenAirportMain.apt.runways[r].length, 
				screenAirportMain.apt.runways[r].width]);
	}
	line[0].setValue(sprintf("%s", screenAirportMain.apt.name)); #TODO check length to truncate if too long
	rwyindex = me.page * 4;
	for (var l = 1; l < LINES; l += 1) {
	    rwyindex += 1;
	    if (rwyindex < size(me.rwylist))
		line[l].setValue(sprintf("%s - %s [%dm / %dm]", 
					me.rwylist[rwyindex][0],
					me.rwylist[rwyindex][1], 
					me.rwylist[rwyindex][2],
					me.rwylist[rwyindex][3]));
	    else
		line[l].setValue("");
	}
    }
};

var screenSearchAirport = {
    right : func {
    },
    enter : func {
    },
    escape : func {
    },
    start : func {
	screenAirportMain.oaci = arg[0];
	var found = screenAirportMain.search();
	if (found != 0) {
	    screenAirportMain.searched = 1;
	    screenEdit.previous_page = 0;
	    return 1;
	}
	else
	    return 0;
    },
    lines : func {
	EditMode(4, "AIRPORT CODE", "SEARCH");
    }
};