<?xml version="1.0"?>

<!--
command interface /autopilot/route-manager/input:

  @clear             ... clear route
  @pop               ... remove first entry
  @delete3           ... delete 4th entry
  @insert2:ksfo@900  ... insert "ksfo@900" as 3rd entry
  ksfo@900           ... append "ksfo@900"

-->

<PropertyList>
    <name>route-manager</name>
    <layout>vbox</layout>
    <resizable>true</resizable>

    <nasal>
        <open>
            var ft = getprop("/sim/startup/units") == "feet";
            var dlg = props.globals.getNode("/sim/gui/dialogs/route-manager", 1);
            var selection = dlg.getNode("selection", 1);
            var input = dlg.getNode("input", 1);    
            var routem = props.globals.getNode("/autopilot/route-manager", 1);

            selection.setIntValue(-1);
            input.setValue("");

            var list = cmdarg().getNode("list");
            var cmd = routem.getNode("input", 1);
            var route = routem.getNode("route", 1);
            var dep = routem.getNode("departure", 1);
            var dest = routem.getNode("destination", 1);
            
            var sel_index = func {
                return int(selection.getValue());
            }

            var clear = func {
                cmd.setValue("@clear");
            }

            var insert = func {
                var insertIndex = sel_index();
                if (insertIndex >= 0) {
                    # when selection index is valid, insert *after* the waypoint
                    insertIndex = insertIndex + 1;
                }
                
                cmd.setValue("@insert" ~ insertIndex ~ ":" ~ input.getValue());
                input.setValue("");
                
                if (insertIndex >= 0) {
                    selection.setValue(insertIndex);
                    gui.dialog_update("route-manager");
                }
            }

            var remove = func {
                cmd.setValue("@delete" ~ sel_index());
            }
            
            var route = func {
                cmd.setValue("@route" ~ sel_index());
            }
            
            var jump_to = func {
                cmd.setValue("@jump" ~ sel_index());
            }
            
            var load_route = func(path) {
                routem.getNode("file-path", 1).setValue(path.getValue());
                cmd.setValue("@load");
                gui.dialog_update("route-manager");
            }

            var save_route = func(path) {
                routem.getNode("file-path", 1).setValue(path.getValue());
                cmd.setValue("@save");
                gui.dialog_update("route-manager");
            }
            
            var file_selector = gui.FileSelector.new(load_route, "Load flight-plan", "Load");
            var save_selector = gui.FileSelector.new(save_route, "Save flight-plan", "Save");

            var activate_fp = func {
                cmd.setValue("@activate");
            }
            
            var departureRunways = dlg.getNode("departure-runways", 1);
            var destRunways = dlg.getNode("destination-runways", 1);
            var sids = dlg.getNode("sids", 1);
            var stars = dlg.getNode("stars", 1);
            
            var updateRunways = func {         
                var depIcao = dep.getNode("airport").getValue();
                departureRunways.removeChildren("value");

                var currentRunway = dep.getNode("runway").getValue();
                var foundCurrent = 0;
                
                var apt = airportinfo(depIcao);
                if (apt != nil) {
                    var i=0;
                    foreach (var rwy; keys(apt.runways)) {
                        departureRunways.getNode("value[" ~ i ~ "]", 1).setValue(rwy);
                        i += 1;
                        if (rwy == currentRunway) {
                            foundCurrent = 1;
                        }
                    }
                }
                
                if (!foundCurrent) {
                    dep.getNode("runway").clearValue();
                }
                
                var destIcao = dest.getNode("airport").getValue();
                destRunways.removeChildren("value");
                currentRunway = dest.getNode("runway").getValue();
                foundCurrent = 0;
                
                var apt = airportinfo(destIcao);
                if (apt != nil) {
                    var i=0;
                    foreach (var rwy; keys(apt.runways)) {
                        destRunways.getNode("value[" ~ i ~ "]", 1).setValue(rwy);
                        i += 1;
                        if (rwy == currentRunway) {
                            foundCurrent = 1;
                        }
                    }
                }
                
                if (!foundCurrent) {
                    dest.getNode("runway").clearValue();
                }
                
                print("updated runways");
                gui.dialog_update("route-manager");
            }
            
            var updateSIDs = func {
                sids.removeChildren("value");
                var depIcao = dep.getNode("airport").getValue();
                var rwy = dep.getNode("runway").getValue();
                var apt = airportinfo(depIcao);
                if (apt == nil or apt.runways[rwy] == nil) {
                    dep.getNode("sid").clearValue();
                    gui.dialog_update("route-manager", "sid");
                    return;
                }
                
                sids.getNode("value[0]", 1).setValue("(none)");
                var i=1;
                foreach (var s; apt.runways[rwy].sids) {
                    sids.getNode("value[" ~ i ~ "]", 1).setValue(s);
                    i += 1;
                }
                
                gui.dialog_update("route-manager", "sid");
            }
            
            var updateSTARs = func {
                stars.removeChildren("value");
                var icao = dest.getNode("airport").getValue();
                var rwy = dest.getNode("runway").getValue();
                var apt = airportinfo(icao);
                if (apt == nil or apt.runways[rwy] == nil) {
                    dest.getNode("star").clearValue();
                    gui.dialog_update("route-manager", "star");
                    return;
                }
                
                var i=1;
                stars.getNode("value[0]", 1).setValue("(none)");
                foreach (var s; apt.runways[rwy].stars) {
                    stars.getNode("value[" ~ i ~ "]", 1).setValue(s);
                    i += 1;
                }
                
                gui.dialog_update("route-manager", "star");
            }
            
        # initialise departure values based on current position
            cmd.setValue("@posinit");
            
            updateRunways();
            updateSIDs();
            updateSTARs();
        </open>

        <close>
            file_selector.del();
            save_selector.del();
        </close>
    </nasal>

    <group>
        <layout>hbox</layout>
        <empty><stretch>1</stretch></empty>

        <text>
            <label>Route Manager</label>
        </text>

        <empty><stretch>1</stretch></empty>

        <button>
            <pref-width>16</pref-width>
            <pref-height>16</pref-height>
            <legend></legend>
            <default>1</default>
            <keynum>27</keynum>
            <border>2</border>

            <binding>
                <command>dialog-close</command>
            </binding>
        </button>
    </group>
    <hrule/>
    <!-- departure / arrival airport information -->
    
    <group>
        <layout>hbox</layout>
        <text>
            <label>Departure:</label>
            <pref-width>80</pref-width>
        </text>
        <input>
            <name>departure-airport</name>
            <pref-width>60</pref-width>
            <property>/autopilot/route-manager/departure/airport</property>
            <live>true</live>
            <binding>
                <command>dialog-apply</command>
                <object-name>departure-airport</object-name>
            </binding>
            
            <binding>
                <command>nasal</command>
                <script>updateRunways();</script>
            </binding>
        </input>
        
        <text>
            <format>%s</format>
            <property>/autopilot/route-manager/departure/name</property>
            <live>true</live>
            <stretch>true</stretch>
            <halign>fill</halign>
        </text>
                
        <text>
            <label>Rwy:</label>
        </text>
        <combo>
            <name>departure-runway</name>
            <pref-width>60</pref-width>
            <property>/autopilot/route-manager/departure/runway</property>
            <editable>false</editable>
            <properties>/sim/gui/dialogs/route-manager/departure-runways</properties>
            
            <binding>
                <command>dialog-apply</command>
                <object-name>departure-runway</object-name>
            </binding>
            <binding>
                <command>nasal</command>
                <script>updateSIDs();</script>
            </binding>
        </combo>
        
        <text>
            <label>SID:</label>
        </text>
        <combo>
            <name>sid</name>
            <pref-width>100</pref-width>
            <property>/autopilot/route-manager/departure/sid</property>
            <editable>false</editable>
            <properties>/sim/gui/dialogs/route-manager/sids</properties>
            
            <binding>
                <command>dialog-apply</command>
                <object-name>sid</object-name>
            </binding>
        </combo>
    </group>
    
    <group>
        <layout>hbox</layout>
        <text>
            <label>Arrival:</label>
            <pref-width>80</pref-width>
        </text>
        <input>
            <name>destination-airport</name>
            <pref-width>60</pref-width>
            <property>/autopilot/route-manager/destination/airport</property>
            <live>true</live>
            <binding>
                <command>dialog-apply</command>
                <object-name>destination-airport</object-name>
            </binding>
            <binding>
                <command>nasal</command>
                <script>updateRunways();</script>
            </binding>
        </input>
        <text>
            <stretch>true</stretch>
            <format>%s</format>
            <property>/autopilot/route-manager/destination/name</property>
            <live>true</live>
            <halign>fill</halign>
        </text>
        
        <text>
            <label>Rwy:</label>
        </text>
        <combo>
            <name>destination-runway</name>
            <pref-width>60</pref-width>
            <property>/autopilot/route-manager/destination/runway</property>
            <editable>false</editable>
            <properties>/sim/gui/dialogs/route-manager/destination-runways</properties>
            
            <binding>
                <command>dialog-apply</command>
                <object-name>destination-runway</object-name>
            </binding>
            
            <binding>
                <command>nasal</command>
                <script>updateSTARs();</script>
            </binding>
        </combo>
        
        <text>
            <label>STAR:</label>
        </text>
        <combo>
            <name>star</name>
            <pref-width>100</pref-width>
            <property>/autopilot/route-manager/destination/star</property>
            <editable>false</editable>
            <properties>/sim/gui/dialogs/route-manager/stars</properties>
            
            <binding>
                <command>dialog-apply</command>
                <object-name>star</object-name>
            </binding>
        </combo>
    </group>
    <!--
    <group>
        <layout>hbox</layout>
        <text>
            <label>Alternate:</label>
            <pref-width>80</pref-width>
        </text>
        <input>
            <name>alt-airport</name>
            <halign>fill</halign>
            <stretch>true</stretch>
            <pref-width>150</pref-width>
            <property>/autopilot/route-manager/alternate/airport</property>
        </input>
        
    </group>
    -->
    <group>
        <layout>hbox</layout>
        <text>
            <label>Cruise Speed (kts):</label>
            <pref-width>80</pref-width>
        </text>
        <input>
            <name>cruise-speed</name>
            <live>true</live>
            <halign>fill</halign>
            <stretch>true</stretch>
            <pref-width>150</pref-width>
            <property>/autopilot/route-manager/cruise/speed-kts</property>
        </input>
        
        <text>
            <label>Cruise Altitude (ft/FL):</label>
            <pref-width>80</pref-width>
        </text>
        <input>
            <name>cruise-alt</name>
            <live>true</live>
            <halign>fill</halign>
            <stretch>true</stretch>
            <pref-width>150</pref-width>
            <property>/autopilot/route-manager/cruise/altitude-ft</property>
        </input>
    </group>
    
    <hrule/>

    <group>
        <layout>hbox</layout>
        <default-padding>2</default-padding>

        <text>
            <label>MMMMMMMMMMMMMMMM</label>
            <format>Target: %s</format>
            <property>/autopilot/route-manager/wp[0]/id</property>
            <live>true</live>
        </text>

        <text>
            <label>MMMMMMMMM</label>
            <format>Dist: %.2f nm</format>
            <property>/autopilot/route-manager/wp[0]/dist</property>
            <live>true</live>
        </text>

        <text>
            <label>MMMMMMMMM</label>
            <format>ETA: %s</format>
            <property>/autopilot/route-manager/wp[0]/eta</property>
            <live>true</live>
        </text>
    </group>

    <waypointlist>
        <name>list</name>
        <halign>fill</halign>
        <valign>fill</valign>
        <stretch>true</stretch>
        <pref-height>150</pref-height>
        <property>/sim/gui/dialogs/route-manager/selection</property>
        <binding>
            <command>dialog-apply</command>
            <object-name>list</object-name>
        </binding>
    </waypointlist>

    <group>
        <layout>hbox</layout>
        <default-padding>4</default-padding>

        <text>
            <label>Waypoint:</label>
            <pref-width>60</pref-width>
        </text>

        <input>
            <name>input</name>
            <halign>fill</halign>
            <stretch>true</stretch>
            <pref-width>220</pref-width>
            <property>/sim/gui/dialogs/route-manager/input</property>
        </input>

        <button>
            <legend>Add</legend>
            <default>true</default>
            <pref-width>70</pref-width>
            <binding>
                <command>dialog-apply</command>
				<object-name>input</object-name>
            </binding>
            <binding>
                <command>nasal</command>
                <script>insert()</script>
            </binding>
            <binding>
                <command>dialog-update</command>
            </binding>
        </button>
    </group>

    <text>
        <padding>1</padding>
        <label>Format: (airport|fix|nav|lon,lat)[@alt] -- e.g. "KSFO@900"</label>
        <color>
            <red>0.5</red>
            <green>0.5</green>
            <blue>0.5</blue>
        </color>
    </text>

    <group>
        <layout>hbox</layout>
        <halign>fill</halign>
        <default-padding>6</default-padding>

        <button>
            <legend>Clear List</legend>
            <equal>true</equal>
            <binding>
                <command>nasal</command>
                <script>clear()</script>
            </binding>
        </button>

        <button>
            <legend>Remove</legend>
            <enable>
                <greater-than>
                <property>/sim/gui/dialogs/route-manager/selection</property>
                <value>-1</value>
                </greater-than>
            </enable>
            <binding>
                <command>nasal</command>
                <script>remove()</script>
            </binding>
        </button>

		<button>
			<legend>Route</legend>
			<binding>
				<command>nasal</command>
				<script>route()</script>
			</binding>
		</button>
<!--
        <button>
            <legend>Auto-route</legend>
            <equal>true</equal>
            <binding>
                <command>nasal</command>
                <script>auto_route()</script>
            </binding>
        </button>
-->
        <button>
            <legend>Jump To</legend>
            <enable>
                <greater-than>
                <property>/sim/gui/dialogs/route-manager/selection</property>
                <value>-1</value>
                </greater-than>
            </enable>
            <binding>
                <command>nasal</command>
                <script>jump_to()</script>
            </binding>
        </button>

        <button>
            <legend>Activate</legend>
            <equal>true</equal>
            <enable>
                <not><property>/autopilot/route-manager/active</property></not>
            </enable>
            <binding>
                <command>dialog-apply</command>
            </binding>
            <binding>
                <command>nasal</command>
                <script>activate_fp()</script>
            </binding>
        </button>
        
        <empty><stretch>true</stretch></empty>

        <button>
            <legend>Load...</legend>
            <equal>true</equal>
            <enable>
            <not><property>/autopilot/route-manager/active</property></not>
            </enable>
            <binding>
                <command>nasal</command>
                <script>file_selector.open()</script>
            </binding>
        </button>
        <button>
            <legend>Save...</legend>
            <equal>true</equal>
            <binding>
                <command>nasal</command>
                <script>save_selector.open();</script>
            </binding>
        </button>
    </group>
</PropertyList>