#include "script_component.hpp"
/*
 * Author: Rosuto, Ruthberg
 * Creates the DAGR menu dialog
 *
 * Arguments:
 * None
 *
 * Return Value:
 * None
 *
 * Example:
 *
 * Public: No
 */

#define __dsp (uiNamespace getVariable "DAGR_MENU")
#define __F1 266874
#define __F2 266875
#define __F3 266876
#define __Option0 2668777
#define __Option1 2668778
#define __Option2 2668779
#define __Option3 2668780
#define __Option4 2668781
#define __Selection0 2668783
#define __Selection1 2668784
#define __Selection2 2668785
#define __Selection3 2668786
#define __Selection4 2668787
#define __mainText 2668782
#define __PSelection1 2668788
#define __PSelection2 2668789
#define __PSelection3 2668790
#define __PSelection4 2668791
#define __PSelection5 2668792
#define __PSelection6 2668793
#define __PSelection7 2668794
#define __PSelection8 2668795

135471 cutText ["", "PLAIN"];
closeDialog 0;
createDialog "DAGR_MENU";

GVAR(menu) = "main";
GVAR(selection) = 0;
GVAR(numSelections) = 5;
GVAR(tmpUpdateRate) = GVAR(updateInterval);
GVAR(edit) = false;
GVAR(add) = false;
GVAR(pointer) = 0;
GVAR(digit1) = 0;
GVAR(digit2) = 0;
GVAR(digit3) = 0;
GVAR(digit4) = 0;
GVAR(digit5) = 0;
GVAR(digit6) = 0;
GVAR(digit7) = 0;
GVAR(digit8) = 0;

GVAR(busy) = false;
GVAR(busyTimer) = 0;

GVAR(showNoWaypointsFound) = false;
GVAR(showInfoUpdatin) = false;
GVAR(showDeleting) = false;
GVAR(showOutOfSpace) = false;

GVAR(PWR) = false;
GVAR(menuRun) = true;
[{
    if (!dialog || GVAR(PWR) || !GVAR(menuRun)) exitWith {
        closeDialog 266860;
        GVAR(menuRun) = false;
        [_this select 1] call CBA_fnc_removePerFrameHandler;
    };

    if (GVAR(MENU_B)) then {
        GVAR(menu) = "main";
        GVAR(selection) = 0;
        GVAR(numSelections) = 5;
    };

    if (!GVAR(add) && !GVAR(edit)) then {
        if (GVAR(DOWN)) then {
            GVAR(selection) = (GVAR(numSelections) + GVAR(selection) + 1);
        };
        if (GVAR(UP)) then {
            GVAR(selection) = (GVAR(numSelections) + GVAR(selection) - 1);
        };
        GVAR(selection) = if (GVAR(numSelections) > 0) then { GVAR(selection) % GVAR(numSelections) } else { 0 };
    };

    if (GVAR(LEFT)) then {
        GVAR(pointer) = (8 + GVAR(pointer) - 1);
    };
    if (GVAR(RIGHT)) then {
        GVAR(pointer) = (8 + GVAR(pointer) + 1);
    };
    GVAR(pointer) = GVAR(pointer) % 8;

    (__dsp displayCtrl __PSelection1) ctrlSetText "";
    (__dsp displayCtrl __PSelection2) ctrlSetText "";
    (__dsp displayCtrl __PSelection3) ctrlSetText "";
    (__dsp displayCtrl __PSelection4) ctrlSetText "";
    (__dsp displayCtrl __PSelection5) ctrlSetText "";
    (__dsp displayCtrl __PSelection6) ctrlSetText "";
    (__dsp displayCtrl __PSelection7) ctrlSetText "";
    (__dsp displayCtrl __PSelection8) ctrlSetText "";

    (__dsp displayCtrl __Selection0) ctrlSetText "";
    (__dsp displayCtrl __Selection1) ctrlSetText "";
    (__dsp displayCtrl __Selection2) ctrlSetText "";
    (__dsp displayCtrl __Selection3) ctrlSetText "";
    (__dsp displayCtrl __Selection4) ctrlSetText "";

    (__dsp displayCtrl __F1) ctrlSetText "";
    (__dsp displayCtrl __F2) ctrlSetText "";
    (__dsp displayCtrl __F3) ctrlSetText "";

    (__dsp displayCtrl __mainText) ctrlSetText "";
    (__dsp displayCtrl __Option0) ctrlSetText "";
    (__dsp displayCtrl __Option1) ctrlSetText "";
    (__dsp displayCtrl __Option2) ctrlSetText "";
    (__dsp displayCtrl __Option3) ctrlSetText "";
    (__dsp displayCtrl __Option4) ctrlSetText "";

    switch (GVAR(menu)) do {
        case "main": {
            if (GVAR(SEL)) then {
                 switch (GVAR(selection)) do {
                    case 0: {
                        GVAR(displaySelection) = "DATA";
                        GVAR(vectorConnected) = false;
                        if (!GVAR(busy)) then {
                            GVAR(busy) = true;
                            GVAR(busyTimer) = CBA_missionTime;
                        };
                        (__dsp displayCtrl __mainText) ctrlSetText "Acquiring Data.";
                        if (CBA_missionTime - GVAR(busyTimer) > 0.5) then {
                            (__dsp displayCtrl __mainText) ctrlSetText "Acquiring Data..";
                        };
                        if (CBA_missionTime - GVAR(busyTimer) > 1.0) then {
                            (__dsp displayCtrl __mainText) ctrlSetText "Acquiring Data...";
                        };
                        if (CBA_missionTime - GVAR(busyTimer) > 1.5) then {
                            (__dsp displayCtrl __mainText) ctrlSetText "Position Acquired";
                        };
                        if (CBA_missionTime - GVAR(busyTimer) > 3.0) then {
                            GVAR(busy) = false;
                        };
                    };
                    case 1: {
                        if (GVAR(numWaypoints) < 1) then {
                            (__dsp displayCtrl __mainText) ctrlSetText "No Waypoints Found";
                            if (!GVAR(busy)) then {
                                GVAR(showNoWaypointsFound) = true;
                                GVAR(busy) = true;
                                GVAR(busyTimer) = CBA_missionTime;
                            };
                        } else {
                            GVAR(menu) = "goto_wp"; GVAR(numSelections) = GVAR(numWaypoints); GVAR(selection) = 0;
                        };
                    };
                    case 2: { GVAR(menu) = "wp_list"; GVAR(numSelections) = GVAR(numWaypoints); GVAR(selection) = 0 };
                    case 3: { GVAR(menu) = "connect"; GVAR(numSelections) = 1; };
                    case 4: { GVAR(menu) = "options"; GVAR(numSelections) = 2; };
                 };
            };
            if (GVAR(busy) && GVAR(showNoWaypointsFound)) then {
                if (CBA_missionTime - GVAR(busyTimer) > 2) then {
                    GVAR(showNoWaypointsFound) = false;
                    GVAR(busy) = false;
                };
            };
            if (!GVAR(busy)) then {
                (__dsp displayCtrl __Option0) ctrlSetText "DATA VIEW";
                (__dsp displayCtrl __Option1) ctrlSetText "GOTO WP";
                (__dsp displayCtrl __Option2) ctrlSetText "WP LIST";
                (__dsp displayCtrl __Option3) ctrlSetText "CONNECT TO";
                (__dsp displayCtrl __Option4) ctrlSetText "OPTIONS";
                (__dsp displayCtrl (__Selection0 + GVAR(selection))) ctrlSetText QPATHTOF(UI\DAGR_Selection.paa);
            };
        };
        case "goto_wp": {
            if (!GVAR(busy)) then {
                (__dsp displayCtrl __Option0) ctrlSetText GVAR(wpString0);
                (__dsp displayCtrl __Option1) ctrlSetText GVAR(wpString1);
                (__dsp displayCtrl __Option2) ctrlSetText GVAR(wpString2);
                (__dsp displayCtrl __Option3) ctrlSetText GVAR(wpString3);
                (__dsp displayCtrl __Option4) ctrlSetText GVAR(wpString4);
                if (GVAR(numSelections) > 0) then {
                    (__dsp displayCtrl (__Selection0 + GVAR(selection))) ctrlSetText QPATHTOF(UI\DAGR_Selection.paa);
                };
            };
            if (GVAR(SEL)) then {
                GVAR(vectorConnected) = false;
                GVAR(displaySelection) = "WP";
                switch (GVAR(selection)) do {
                    case 0: { DAGR_WP_INFO = GVAR(wp0); };
                    case 1: { DAGR_WP_INFO = GVAR(wp1); };
                    case 2: { DAGR_WP_INFO = GVAR(wp2); };
                    case 3: { DAGR_WP_INFO = GVAR(wp3); };
                    case 4: { DAGR_WP_INFO = GVAR(wp4); };
                };
                if (!GVAR(busy)) then {
                    GVAR(showInfoUpdating) = true;
                    GVAR(busy) = true;
                    GVAR(busyTimer) = CBA_missionTime;
                };
            };
            if (GVAR(busy) && GVAR(showInfoUpdating)) then {
                (__dsp displayCtrl __mainText) ctrlSetText "Info Update.";
                if (CBA_missionTime - GVAR(busyTimer) > 1) then {
                    (__dsp displayCtrl __mainText) ctrlSetText "Info Update..";
                };
                if (CBA_missionTime - GVAR(busyTimer) > 1.2) then {
                    (__dsp displayCtrl __mainText) ctrlSetText "Info Update...";
                };
                if (CBA_missionTime - GVAR(busyTimer) > 1.4) then {
                    (__dsp displayCtrl __mainText) ctrlSetText "Info Updated";
                };
                if (CBA_missionTime - GVAR(busyTimer) > 2.9) then {
                    GVAR(showInfoUpdating) = false;
                    GVAR(busy) = false;
                };
            };
        };
        case "wp_list": {
            if (!GVAR(add) && !GVAR(edit)) then {
                if (!GVAR(busy)) then {
                    (__dsp displayCtrl __Option0) ctrlSetText GVAR(wpString0);
                    (__dsp displayCtrl __Option1) ctrlSetText GVAR(wpString1);
                    (__dsp displayCtrl __Option2) ctrlSetText GVAR(wpString2);
                    (__dsp displayCtrl __Option3) ctrlSetText GVAR(wpString3);
                    (__dsp displayCtrl __Option4) ctrlSetText GVAR(wpString4);
                    (__dsp displayCtrl __F1) ctrlSetText "Add";
                    (__dsp displayCtrl __F2) ctrlSetText "Edit";
                    (__dsp displayCtrl __F3) ctrlSetText "Delete";
                    if (GVAR(numSelections) > 0) then {
                        (__dsp displayCtrl (__Selection0 + GVAR(selection))) ctrlSetText QPATHTOF(UI\DAGR_Selection.paa);
                    };
                };
                if (GVAR(F3) && GVAR(numWaypoints) > 0) then {
                    if (!GVAR(busy)) then {
                        switch (GVAR(selection)) do {
                            case 0: {
                                GVAR(wpString0) = GVAR(wpString1);
                                GVAR(wp0) = GVAR(wp1);
                                GVAR(wpString1) = GVAR(wpString2);
                                GVAR(wp1) = GVAR(wp2);
                                GVAR(wpString2) = GVAR(wpString3);
                                GVAR(wp2) = GVAR(wp3);
                                GVAR(wpString3) = GVAR(wpString4);
                                GVAR(wp3) = GVAR(wp4);
                                GVAR(wpString4) = "";
                                GVAR(wp4) = "";
                            };
                            case 1: {
                                GVAR(wpString1) = GVAR(wpString2);
                                GVAR(wp1) = GVAR(wp2);
                                GVAR(wpString2) = GVAR(wpString3);
                                GVAR(wp2) = GVAR(wp3);
                                GVAR(wpString3) = GVAR(wpString4);
                                GVAR(wp3) = GVAR(wp4);
                                GVAR(wpString4) = "";
                                GVAR(wp4) = "";
                            };
                            case 2: {
                                GVAR(wpString2) = GVAR(wpString3);
                                GVAR(wp2) = GVAR(wp3);
                                GVAR(wpString3) = GVAR(wpString4);
                                GVAR(wp3) = GVAR(wp4);
                                GVAR(wpString4) = "";
                                GVAR(wp4) = "";
                            };
                            case 3: {
                                GVAR(wpString3) = GVAR(wpString4);
                                GVAR(wp3) = GVAR(wp4);
                                GVAR(wpString4) = "";
                                GVAR(wp4) = "";
                            };
                            case 4: {
                                GVAR(wpString4) = "";
                                GVAR(wp4) = "";
                            };
                        };
                        GVAR(numWaypoints) = GVAR(numWaypoints) - 1;
                        GVAR(numSelections) = GVAR(numWaypoints);
                        GVAR(showDeleting) = true;
                        GVAR(busy) = true;
                        GVAR(busyTimer) = CBA_missionTime;
                    };
                };
                if (GVAR(busy) && GVAR(showDeleting)) then {
                    (__dsp displayCtrl __mainText) ctrlSetText "Deleting.";
                    if (CBA_missionTime - GVAR(busyTimer) > 1) then {
                        (__dsp displayCtrl __mainText) ctrlSetText "Deleting..";
                    };
                    if (CBA_missionTime - GVAR(busyTimer) > 1.2) then {
                        (__dsp displayCtrl __mainText) ctrlSetText "Deleting...";
                    };
                    if (CBA_missionTime - GVAR(busyTimer) > 1.4) then {
                        (__dsp displayCtrl __mainText) ctrlSetText "Waypoint Deleted";
                    };
                    if (CBA_missionTime - GVAR(busyTimer) > 2.9) then {
                        GVAR(showDeleting) = false;
                        GVAR(busy) = false;
                    };
                };
                if (GVAR(F1)) then {
                    if (GVAR(numWaypoints) == 5) then {
                        if (!GVAR(busy)) then {
                            GVAR(showOutOfSpace) = true;
                            GVAR(busy) = true;
                            GVAR(busyTimer) = CBA_missionTime;
                        };
                    } else {
                        GVAR(digit1) = 0;
                        GVAR(digit2) = 0;
                        GVAR(digit3) = 0;
                        GVAR(digit4) = 0;
                        GVAR(digit5) = 0;
                        GVAR(digit6) = 0;
                        GVAR(digit7) = 0;
                        GVAR(digit8) = 0;
                        GVAR(pointer) = 0;
                        GVAR(add) = true;
                    };
                };
                if (GVAR(busy) && GVAR(showOutOfSpace)) then {
                    (__dsp displayCtrl __mainText) ctrlSetText "Out of Space";
                    if (CBA_missionTime - GVAR(busyTimer) > 2.5) then {
                        GVAR(showOutOfSpace) = false;
                        GVAR(busy) = false;
                    };
                };
                if (GVAR(F2) && GVAR(numWaypoints) > 0) then {
                    GVAR(pointer) = 0;
                    GVAR(edit) = true;
                    GVAR(add) = false;
                    switch (GVAR(selection)) do {
                        case 0: {
                            GVAR(digit1) = floor (GVAR(wp0) / 10000000);
                            GVAR(digit2) = floor (GVAR(wp0) / 1000000 - GVAR(digit1) *10);
                            GVAR(digit3) = floor (GVAR(wp0) / 100000 - GVAR(digit2) * 10 - GVAR(digit1) * 100);
                            GVAR(digit4) = floor (GVAR(wp0) / 10000 - GVAR(digit3) * 10 - GVAR(digit2) * 100 - GVAR(digit1) * 1000);
                            GVAR(digit5) = floor (GVAR(wp0) / 1000 - GVAR(digit4) * 10 - GVAR(digit3) * 100 - GVAR(digit2) * 1000 - GVAR(digit1) * 10000);
                            GVAR(digit6) = floor (GVAR(wp0) / 100 - GVAR(digit5) * 10 - GVAR(digit4) * 100 - GVAR(digit3) * 1000 - GVAR(digit2) * 10000 - GVAR(digit1) * 100000);
                            GVAR(digit7) = floor (GVAR(wp0) / 10 - GVAR(digit6) * 10 - GVAR(digit5) * 100 - GVAR(digit4) * 1000 - GVAR(digit3) * 10000 - GVAR(digit2) * 100000 - GVAR(digit1) * 1000000);
                            GVAR(digit8) = floor (GVAR(wp0) - GVAR(digit7) * 10 - GVAR(digit6) * 100 - GVAR(digit5) * 1000 - GVAR(digit4) * 10000 - GVAR(digit3) * 100000 - GVAR(digit2) * 1000000 - GVAR(digit1) * 10000000);
                        };
                        case 1: {
                            GVAR(digit1) = floor (GVAR(wp1) / 10000000);
                            GVAR(digit2) = floor (GVAR(wp1) / 1000000 - GVAR(digit1) *10);
                            GVAR(digit3) = floor (GVAR(wp1) / 100000 - GVAR(digit2) * 10 - GVAR(digit1) * 100);
                            GVAR(digit4) = floor (GVAR(wp1) / 10000 - GVAR(digit3) * 10 - GVAR(digit2) * 100 - GVAR(digit1) * 1000);
                            GVAR(digit5) = floor (GVAR(wp1) / 1000 - GVAR(digit4) * 10 - GVAR(digit3) * 100 - GVAR(digit2) * 1000 - GVAR(digit1) * 10000);
                            GVAR(digit6) = floor (GVAR(wp1) / 100 - GVAR(digit5) * 10 - GVAR(digit4) * 100 - GVAR(digit3) * 1000 - GVAR(digit2) * 10000 - GVAR(digit1) * 100000);
                            GVAR(digit7) = floor (GVAR(wp1) / 10 - GVAR(digit6) * 10 - GVAR(digit5) * 100 - GVAR(digit4) * 1000 - GVAR(digit3) * 10000 - GVAR(digit2) * 100000 - GVAR(digit1) * 1000000);
                            GVAR(digit8) = floor (GVAR(wp1) - GVAR(digit7) * 10 - GVAR(digit6) * 100 - GVAR(digit5) * 1000 - GVAR(digit4) * 10000 - GVAR(digit3) * 100000 - GVAR(digit2) * 1000000 - GVAR(digit1) * 10000000);
                        };
                        case 2: {
                            GVAR(digit1) = floor (GVAR(wp2) / 10000000);
                            GVAR(digit2) = floor (GVAR(wp2) / 1000000 - GVAR(digit1) *10);
                            GVAR(digit3) = floor (GVAR(wp2) / 100000 - GVAR(digit2) * 10 - GVAR(digit1) * 100);
                            GVAR(digit4) = floor (GVAR(wp2) / 10000 - GVAR(digit3) * 10 - GVAR(digit2) * 100 - GVAR(digit1) * 1000);
                            GVAR(digit5) = floor (GVAR(wp2) / 1000 - GVAR(digit4) * 10 - GVAR(digit3) * 100 - GVAR(digit2) * 1000 - GVAR(digit1) * 10000);
                            GVAR(digit6) = floor (GVAR(wp2) / 100 - GVAR(digit5) * 10 - GVAR(digit4) * 100 - GVAR(digit3) * 1000 - GVAR(digit2) * 10000 - GVAR(digit1) * 100000);
                            GVAR(digit7) = floor (GVAR(wp2) / 10 - GVAR(digit6) * 10 - GVAR(digit5) * 100 - GVAR(digit4) * 1000 - GVAR(digit3) * 10000 - GVAR(digit2) * 100000 - GVAR(digit1) * 1000000);
                            GVAR(digit8) = floor (GVAR(wp2) - GVAR(digit7) * 10 - GVAR(digit6) * 100 - GVAR(digit5) * 1000 - GVAR(digit4) * 10000 - GVAR(digit3) * 100000 - GVAR(digit2) * 1000000 - GVAR(digit1) * 10000000);
                        };
                        case 3: {
                            GVAR(digit1) = floor (GVAR(wp3) / 10000000);
                            GVAR(digit2) = floor (GVAR(wp3) / 1000000 - GVAR(digit1) *10);
                            GVAR(digit3) = floor (GVAR(wp3) / 100000 - GVAR(digit2) * 10 - GVAR(digit1) * 100);
                            GVAR(digit4) = floor (GVAR(wp3) / 10000 - GVAR(digit3) * 10 - GVAR(digit2) * 100 - GVAR(digit1) * 1000);
                            GVAR(digit5) = floor (GVAR(wp3) / 1000 - GVAR(digit4) * 10 - GVAR(digit3) * 100 - GVAR(digit2) * 1000 - GVAR(digit1) * 10000);
                            GVAR(digit6) = floor (GVAR(wp3) / 100 - GVAR(digit5) * 10 - GVAR(digit4) * 100 - GVAR(digit3) * 1000 - GVAR(digit2) * 10000 - GVAR(digit1) * 100000);
                            GVAR(digit7) = floor (GVAR(wp3) / 10 - GVAR(digit6) * 10 - GVAR(digit5) * 100 - GVAR(digit4) * 1000 - GVAR(digit3) * 10000 - GVAR(digit2) * 100000 - GVAR(digit1) * 1000000);
                            GVAR(digit8) = floor (GVAR(wp3) - GVAR(digit7) * 10 - GVAR(digit6) * 100 - GVAR(digit5) * 1000 - GVAR(digit4) * 10000 - GVAR(digit3) * 100000 - GVAR(digit2) * 1000000 - GVAR(digit1) * 10000000);
                        };
                        case 4: {
                            GVAR(digit1) = floor (GVAR(wp4) / 10000000);
                            GVAR(digit2) = floor (GVAR(wp4) / 1000000 - GVAR(digit1) *10);
                            GVAR(digit3) = floor (GVAR(wp4) / 100000 - GVAR(digit2) * 10 - GVAR(digit1) * 100);
                            GVAR(digit4) = floor (GVAR(wp4) / 10000 - GVAR(digit3) * 10 - GVAR(digit2) * 100 - GVAR(digit1) * 1000);
                            GVAR(digit5) = floor (GVAR(wp4) / 1000 - GVAR(digit4) * 10 - GVAR(digit3) * 100 - GVAR(digit2) * 1000 - GVAR(digit1) * 10000);
                            GVAR(digit6) = floor (GVAR(wp4) / 100 - GVAR(digit5) * 10 - GVAR(digit4) * 100 - GVAR(digit3) * 1000 - GVAR(digit2) * 10000 - GVAR(digit1) * 100000);
                            GVAR(digit7) = floor (GVAR(wp4) / 10 - GVAR(digit6) * 10 - GVAR(digit5) * 100 - GVAR(digit4) * 1000 - GVAR(digit3) * 10000 - GVAR(digit2) * 100000 - GVAR(digit1) * 1000000);
                            GVAR(digit8) = floor (GVAR(wp4) - GVAR(digit7) * 10 - GVAR(digit6) * 100 - GVAR(digit5) * 1000 - GVAR(digit4) * 10000 - GVAR(digit3) * 100000 - GVAR(digit2) * 1000000 - GVAR(digit1) * 10000000);
                        };
                    };
                };
            } else {
                if (!GVAR(busy)) then {
                    (__dsp displayCtrl __F1) ctrlSetText "Save";
                    (__dsp displayCtrl __F2) ctrlSetText "Vector";
                    (__dsp displayCtrl __F3) ctrlSetText "Cancel";
                    GVAR(output) = str GVAR(digit1) + str GVAR(digit2) + str GVAR(digit3) + str GVAR(digit4) + str GVAR(digit5) + str GVAR(digit6) + str GVAR(digit7) + str GVAR(digit8);
                    (__dsp displayCtrl __mainText) ctrlSetText GVAR(output);
                    (__dsp displayCtrl __PSelection1 + GVAR(pointer)) ctrlSetText QPATHTOF(UI\DAGR_PSelection.paa);
                };
                if (GVAR(F1)) then {
                    if (!GVAR(busy)) then {
                        if (GVAR(add)) then {
                            switch (GVAR(numWaypoints)) do {
                                case 0: { GVAR(wpString0) = GVAR(output); GVAR(wp0) = parseNumber GVAR(output); };
                                case 1: { GVAR(wpString1) = GVAR(output); GVAR(wp1) = parseNumber GVAR(output); };
                                case 2: { GVAR(wpString2) = GVAR(output); GVAR(wp2) = parseNumber GVAR(output); };
                                case 3: { GVAR(wpString3) = GVAR(output); GVAR(wp3) = parseNumber GVAR(output); };
                                case 4: { GVAR(wpString4) = GVAR(output); GVAR(wp4) = parseNumber GVAR(output); };
                            };
                            GVAR(numWaypoints) = GVAR(numWaypoints) + 1;
                            GVAR(numSelections) = GVAR(numWaypoints);
                            GVAR(selection) = 0;
                        };
                        if (GVAR(edit)) then {
                            switch (GVAR(selection)) do {
                                case 0: { GVAR(wpString0) = GVAR(output); GVAR(wp0) = parseNumber GVAR(output); };
                                case 1: { GVAR(wpString1) = GVAR(output); GVAR(wp1) = parseNumber GVAR(output); };
                                case 2: { GVAR(wpString2) = GVAR(output); GVAR(wp2) = parseNumber GVAR(output); };
                                case 3: { GVAR(wpString3) = GVAR(output); GVAR(wp3) = parseNumber GVAR(output); };
                                case 4: { GVAR(wpString4) = GVAR(output); GVAR(wp4) = parseNumber GVAR(output); };
                            };
                        };
                        GVAR(busy) = true;
                        GVAR(busyTimer) = CBA_missionTime;
                    };
                    (__dsp displayCtrl __F1) ctrlSetText "";
                    (__dsp displayCtrl __F2) ctrlSetText "";
                    (__dsp displayCtrl __F3) ctrlSetText "";
                    (__dsp displayCtrl __mainText) ctrlSetText "Saving.";
                    if (CBA_missionTime - GVAR(busyTimer) > 1) then {
                        (__dsp displayCtrl __mainText) ctrlSetText "Saving..";
                    };
                    if (CBA_missionTime - GVAR(busyTimer) > 1.2) then {
                        (__dsp displayCtrl __mainText) ctrlSetText "Saving...";
                    };
                    if (CBA_missionTime - GVAR(busyTimer) > 1.4) then {
                        (__dsp displayCtrl __mainText) ctrlSetText "Waypoint Saved";
                    };
                    if (CBA_missionTime - GVAR(busyTimer) > 2.9) then {
                        GVAR(edit) = false;
                        GVAR(add) = false;
                        GVAR(busy) = false;
                    };
                };
                if (GVAR(F2)) then {
                    private _grid = toArray GVAR(vectorGrid);
                    _grid deleteAt 4;
                    _grid = toString _grid;
                    private _gridVector = parseNumber _grid;
                    GVAR(digit1) = floor(_gridVector / 10000000);
                    GVAR(digit2) = floor(_gridVector / 1000000 - GVAR(digit1) *10);
                    GVAR(digit3) = floor(_gridVector / 100000 - GVAR(digit2) * 10 - GVAR(digit1) * 100);
                    GVAR(digit4) = floor(_gridVector / 10000 - GVAR(digit3) * 10 - GVAR(digit2) * 100 - GVAR(digit1) * 1000);
                    GVAR(digit5) = floor(_gridVector / 1000 - GVAR(digit4) * 10 - GVAR(digit3) * 100 - GVAR(digit2) * 1000 - GVAR(digit1) * 10000);
                    GVAR(digit6) = floor(_gridVector / 100 - GVAR(digit5) * 10 - GVAR(digit4) * 100 - GVAR(digit3) * 1000 - GVAR(digit2) * 10000 - GVAR(digit1) * 100000);
                    GVAR(digit7) = floor(_gridVector / 10 - GVAR(digit6) * 10 - GVAR(digit5) * 100 - GVAR(digit4) * 1000 - GVAR(digit3) * 10000 - GVAR(digit2) * 100000 - GVAR(digit1) * 1000000);
                    GVAR(digit8) = floor(_gridVector - GVAR(digit7) * 10 - GVAR(digit6) * 100 - GVAR(digit5) * 1000 - GVAR(digit4) * 10000 - GVAR(digit3) * 100000 - GVAR(digit2) * 1000000 - GVAR(digit1) * 10000000);
                };
                if (GVAR(F3)) then {
                    if (!GVAR(busy)) then {
                        GVAR(busy) = true;
                        GVAR(busyTimer) = CBA_missionTime;
                    } else {
                        (__dsp displayCtrl __F1) ctrlSetText "Save";
                        (__dsp displayCtrl __F2) ctrlSetText "Vector";
                        (__dsp displayCtrl __F3) ctrlSetText "Cancel";
                        GVAR(output) = str GVAR(digit1) + str GVAR(digit2) + str GVAR(digit3) + str GVAR(digit4) + str GVAR(digit5) + str GVAR(digit6) + str GVAR(digit7) + str GVAR(digit8);
                        (__dsp displayCtrl __mainText) ctrlSetText GVAR(output);
                    };
                    if (CBA_missionTime - GVAR(busyTimer) > 0.1) then {
                        GVAR(add) = false;
                        GVAR(edit) = false;
                        GVAR(busy) = false;
                    };
                };
                if (GVAR(UP)) then {
                    switch (GVAR(pointer) + 1) do {
                        case 1: { GVAR(digit1) = (10 + GVAR(digit1) + 1) % 10 };
                        case 2: { GVAR(digit2) = (10 + GVAR(digit2) + 1) % 10 };
                        case 3: { GVAR(digit3) = (10 + GVAR(digit3) + 1) % 10 };
                        case 4: { GVAR(digit4) = (10 + GVAR(digit4) + 1) % 10 };
                        case 5: { GVAR(digit5) = (10 + GVAR(digit5) + 1) % 10 };
                        case 6: { GVAR(digit6) = (10 + GVAR(digit6) + 1) % 10 };
                        case 7: { GVAR(digit7) = (10 + GVAR(digit7) + 1) % 10 };
                        case 8: { GVAR(digit8) = (10 + GVAR(digit8) + 1) % 10 };
                    };
                };
                if (GVAR(DOWN)) then {
                    switch (GVAR(pointer) + 1) do {
                        case 1: { GVAR(digit1) = (10 + GVAR(digit1) - 1) % 10 };
                        case 2: { GVAR(digit2) = (10 + GVAR(digit2) - 1) % 10 };
                        case 3: { GVAR(digit3) = (10 + GVAR(digit3) - 1) % 10 };
                        case 4: { GVAR(digit4) = (10 + GVAR(digit4) - 1) % 10 };
                        case 5: { GVAR(digit5) = (10 + GVAR(digit5) - 1) % 10 };
                        case 6: { GVAR(digit6) = (10 + GVAR(digit6) - 1) % 10 };
                        case 7: { GVAR(digit7) = (10 + GVAR(digit7) - 1) % 10 };
                        case 8: { GVAR(digit8) = (10 + GVAR(digit8) - 1) % 10 };
                    };
                };
            };
        };
        case "connect": {
            if (!GVAR(busy)) then {
                (__dsp displayCtrl __Option0) ctrlSetText "Vector 21";
                (__dsp displayCtrl __Selection0) ctrlSetText QPATHTOF(UI\DAGR_Selection.paa);
            };
            if (GVAR(SEL)) then {
                if (!GVAR(busy)) then {
                    GVAR(busy) = true;
                    GVAR(busyTimer) = CBA_missionTime;
                };
                (__dsp displayCtrl __mainText) ctrlSetText "Connecting.";
                if (CBA_missionTime - GVAR(busyTimer) > 0.2) then {
                    (__dsp displayCtrl __mainText) ctrlSetText "Connecting..";
                };
                if (CBA_missionTime - GVAR(busyTimer) > 0.4) then {
                    (__dsp displayCtrl __mainText) ctrlSetText "Connecting...";
                };
                if (CBA_missionTime - GVAR(busyTimer) > 0.6) then {
                    if (({_x isKindOf  ["ACE_Vector", configFile >> "CfgWeapons"]} count (weapons ACE_player)) > 0) then {
                        GVAR(displaySelection) = "VECTOR";
                        (__dsp displayCtrl __mainText) ctrlSetText "Vector Connected";
                        GVAR(vectorConnected) = true;
                    } else {
                        (__dsp displayCtrl __mainText) ctrlSetText "No Device Found";
                        GVAR(vectorConnected) = false;
                    };
                };
                if (CBA_missionTime - GVAR(busyTimer) > 3.1) then {
                    GVAR(busy) = false;
                    if (GVAR(vectorConnected)) then {
                        GVAR(menu) = "main"; GVAR(numSelections) = 5;
                    };
                };
            };
        };
        case "options": {
            (__dsp displayCtrl __Option0) ctrlSetText "Signal Delay";
            (__dsp displayCtrl __Option1) ctrlSetText (if (GVAR(useDegrees)) then { "Direction: Deg" } else { "Direction: MIL" });
            (__dsp displayCtrl (__Selection0 + GVAR(selection))) ctrlSetText QPATHTOF(UI\DAGR_Selection.paa);
            if (GVAR(SEL)) then {
                GVAR(vectorConnected) = false;
                switch (GVAR(selection)) do {
                    case 0: { GVAR(menu) = "update_rate"; GVAR(numSelections) = 1; GVAR(tmpUpdateRate) = GVAR(updateInterval); };
                    case 1: { GVAR(useDegrees) = !GVAR(useDegrees); };
                };
            }
        };
        case "update_rate": {
            if (GVAR(F1)) then {
                GVAR(updateInterval) = GVAR(tmpUpdateRate);
                if (!GVAR(busy)) then {
                    GVAR(busy) = true;
                    GVAR(busyTimer) = CBA_missionTime;
                };
                (__dsp displayCtrl __mainText) ctrlSetText "Updating.";
                if (CBA_missionTime - GVAR(busyTimer) > 0.2) then {
                    (__dsp displayCtrl __mainText) ctrlSetText "Updating..";
                };
                if (CBA_missionTime - GVAR(busyTimer) > 0.4) then {
                    (__dsp displayCtrl __mainText) ctrlSetText "Updating...";
                };
                if (CBA_missionTime - GVAR(busyTimer) > 0.6) then {
                    (__dsp displayCtrl __mainText) ctrlSetText "Update Success";
                };
                if (CBA_missionTime - GVAR(busyTimer) > 2.1) then {
                    GVAR(busy) = false;
                    GVAR(menu) = "options"; GVAR(numSelections) = 2;
                };
            };
            if (GVAR(F3)) then {
                GVAR(menu) = "options"; GVAR(numSelections) = 2;
            };
            if (GVAR(DOWN)) then {
                GVAR(tmpUpdateRate) = GVAR(tmpUpdateRate) - 0.1;
            };
            if (GVAR(UP)) then {
                GVAR(tmpUpdateRate) = GVAR(tmpUpdateRate) + 0.1;
            };
            GVAR(tmpUpdateRate) = 0.1 max GVAR(tmpUpdateRate) min 2.0;
            if (!GVAR(busy)) then {
                (__dsp displayCtrl __mainText) ctrlSetText (Str(GVAR(tmpUpdateRate) * 1000) + "ms");
                (__dsp displayCtrl __F1) ctrlSetText "Save";
                (__dsp displayCtrl __F3) ctrlSetText "Cancel";
            };
        };
    };

    if (!GVAR(busy)) then {
        GVAR(F3) = false;
        GVAR(F2) = false;
        GVAR(F1) = false;
        GVAR(MENU_B) = false;
        GVAR(SEL) = false;
        GVAR(RIGHT) = false;
        GVAR(LEFT) = false;
        GVAR(UP) = false;
        GVAR(DOWN) = false;
        GVAR(PWR) = false;
    };
}, 0, []] call CBA_fnc_addPerFrameHandler;