-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathfmc.user.js
More file actions
27 lines (25 loc) · 26 KB
/
fmc.user.js
File metadata and controls
27 lines (25 loc) · 26 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// ==UserScript==
// @name FMC Extension for GEFS-Online
// @description This extension (by Ethan Shields) adds an FMC which controls other features included such as VNAV, LNAV, route, progress information, etc.
// @namespace GEFS-Plugins
// @match http://*.gefs-online.com/gefs.php*
// @match http://localhost:3000/gefs.php*
// @match http://127.0.0.1:3000/gefs.php*
// @run-at document-end
// @version 0.5.0
// @grant none
// ==/UserScript==
/*
Copyright (c) 2016 Ethan Shields, 2015 Harry Xue
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, please visit http://www.gnu.org/licenses/gpl-3.0.html.
*/
!function(t){var a=setInterval(function(){gefs.aircraft&&gefs.aircraft.animationValue&&gefs.aircraft.animationValue.altitude&&(clearInterval(a),t())},4)}(function(){function t(){var t=gefs.aircraft.llaLocation[0]||0,a=gefs.aircraft.llaLocation[1]||0,e=W[1]||0,n=W[2]||0,i=["--","--","--","--","--"],d=m(fmc.waypoints.nextWaypoint);d=10>d?Math.round(10*d)/10:Math.round(d);for(var p,s=0,o=!0;s<fmc.waypoints.route.length;s++)fmc.waypoints.route[s][1]||(o=!1);p=o?m(fmc.waypoints.route.length+1):fmc.math.getDistance(t,a,e,n);gefs.aircraft.name;!gefs.aircraft.groundContact&&W&&(i[0]=g(p,!0),i[1]=v(i[0][0],i[0][1]),i[4]=g(d,!1),p-I>0&&(i[2]=g(p-I,!1),i[3]=v(i[2][0],i[2][1]))),r(p,d,i)}function a(){var t=m(fmc.waypoints.nextWaypoint);t<=b(60)&&l(fmc.waypoints.nextWaypoint+1),clearInterval(V),V=t<gefs.aircraft.animationValue.kias/60?setInterval(a,500):setInterval(a,3e4)}function e(){var t,a,e,n,i=fmc.waypoints.route,d=o(),p=c(),r=-1!==p,l=gefs.aircraft.animationValue.altitude;r&&(t=i[p-1][3],a=t-l,e=m(p),n=x(a));var u,f,h,g=$("#tSpd").hasClass("btn-warning");if(g&&(u=d[0]),"climb"==D)if(r){var v=x(M-l)+x(t-M);v>e?(f=n>e?fmc.math.getClimbrate(a,e):d[1],h=t):(f=d[1],h=M)}else f=d[1],h=M;else"descent"==D&&(r?n>e&&(f=fmc.math.getClimbrate(a,e),h=t):(f=d[1],l>12e3+R&&(h=100*Math.round((12e3+R)/100))));"cruise"!==D||!F&&I||(r?(I=m(i.length)-e,I+=x(t-M)):I=x(R-M),I=Math.round(I),$("#todInput").val(""+I).change()),u&&$("#Qantas94Heavy-ap-spd > input").val(""+u).change(),f&&$("#Qantas94Heavy-ap-vs > input").val(""+f).change(),h&&$("#Qantas94Heavy-ap-alt > input").val(""+h).change(),s()}function n(t){if(!gefs.pause&&!flight.recorder.playing&&!flight.recorder.paused){var a=Math.round(gefs.aircraft.animationValue.ktas),e=Math.round(gefs.aircraft.animationValue.heading360),i=Math.round(gefs.aircraft.animationValue.altitude),d=gefs.debug.fps,p=Math.round(1e4*gefs.aircraft.llaLocation[0])/1e4,s=Math.round(1e4*gefs.aircraft.llaLocation[1])/1e4,r=new Date,o=r.getUTCHours(),l=r.getUTCMinutes(),c=u(h(o,l));t=t||"none",$("<tr>").addClass("data").append($("<td>"+c+"</td>").css("padding","0px 10px 0px 10px"),$("<td>"+a+"</td>").css("padding","0px 10px 0px 10px"),$("<td>"+e+"</td>").css("padding","0px 10px 0px 10px"),$("<td>"+i+"</td>").css("padding","0px 10px 0px 10px"),$("<td>"+p+"</td>").css("padding","0px 10px 0px 10px"),$("<td>"+s+"</td>").css("padding","0px 10px 0px 10px"),$("<td>"+d+"</td>").css("padding","0px 10px 0px 10px"),$("<td>"+t+"</td>").css("padding","0px 10px 0px 10px")).appendTo("#logData")}clearInterval(S),S=gefs.aircraft.animationValue.altitude>18e3?setInterval(n,12e4):setInterval(n,3e4)}function i(){gefs.aircraft.animationValue.gearPosition!==gefs.aircraft.animationValue.gearTarget&&n(1===gefs.aircraft.animationValue.gearTarget?"Gear Up":"Gear Down"),clearInterval(N),N=gefs.aircraft.animationValue.altitude<1e4?setInterval(i,12e3):setInterval(i,6e4)}function d(){gefs.aircraft.animationValue.flapsPosition!==gefs.aircraft.animationValue.flapsTarget&&n("Flaps set to "+gefs.aircraft.animationValue.flapsTarget)}function p(){var t=gefs.aircraft.animationValue.kcas,a=gefs.aircraft.animationValue.altitude;t>255&&1e4>a&&n("Overspeed"),clearInterval(q),q=1e4>a?setInterval(p,15e3):setInterval(p,3e4)}function s(){var t=100*Math.round(gefs.aircraft.animationValue.altitude/100);if("climb"===D&&t===Number(M))$("#phaseBtn").click();else if("cruise"===D){var a=m(fmc.waypoints.route.length+1);t!==Number(M)?$("#phaseBtn").click():I>=a&&$("#phaseBtn").click()}}function r(t,a,e){for(var n=0;n<e.length;n++)e[n]=u(e[n]);t=10>t?Math.round(10*t)/10:Math.round(t),$("#flightete").text("ETE: "+e[0]),$("#flighteta").text("ETA: "+e[1]),$("#todete").text("ETE: "+e[2]),$("#todeta").text("ETA: "+e[3]),$("#flightdist").text(t+" nm"),$("#externaldist").text(t+" nm"),$("#toddist").text(t-I+" nm"),$("#nextDist").text(a+" nm"),$("#nextETE").text(e[4])}function o(){var t,a,e=(gefs.aircraft.name,gefs.groundElevation*metersToFeet,gefs.aircraft.animationValue.altitude),n="M."===$("#Qantas94Heavy-ap-spd span:last-child").text().trim(),i=function(){$("#Qantas94Heavy-ap-spd span:last-child").click()};if("climb"==D){3e4>e?n&&i():e>=3e4&&(n||i());for(var d,p=fmc.vnav.profile.climb,s=0;s<p.length;s++)e>p[s][0]&&e<=p[s][1]&&(d=s);t=p[d][2],a=p[d][3]}else if("descent"==D){e>3e4?n||i():n&&i();for(var d,p=fmc.vnav.profile.descent,s=0;s<p.length;s++)e>p[s][0]&&e<=p[s][1]&&(d=s);t=p[d][2],a=p[d][3]}return[t,a]}function l(t){if(fmc.waypoints.nextWaypoint!=t)if(t<=fmc.waypoints.route.length){fmc.waypoints.nextWaypoint=t;var a=fmc.waypoints.route[fmc.waypoints.nextWaypoint-1];a[4]?$("#Qantas94Heavy-ap-icao > input").val(a[0]).change():($("#Qantas94Heavy-ap-gc-lat > input").val(a[1]).change(),$("#Qantas94Heavy-ap-gc-lon > input").val(a[2]).change()),$(".activate").removeClass("btn-warning"),$("#waypoints tr:nth-child("+(t+1)+") .btn").addClass("btn-warning")}else $("#Qantas94Heavy-ap-icao > input").val(W[0]).change(),$(".activate").removeClass("btn-warning");else $(".activate").removeClass("btn-warning"),fmc.waypoints.nextWaypoint=void 0,$("#Qantas94Heavy-ap-icao > input").val("").change()}function c(){for(var t=fmc.waypoints.nextWaypoint;t<=fmc.waypoints.route.length;t++)if(fmc.waypoints.route[t-1][3])return t;return-1}function u(t){return t[1]=f(t[1]),t[0]+":"+t[1]}function f(t){return 10>t&&(t="0"+t),t}function h(t,a){return a>=60&&(a-=60,t++),t>=24&&(t-=24),[t,a]}function g(t,a){var e=t/gefs.aircraft.animationValue.ktas,n=parseInt(e),i=Math.round(60*(e-n));return a&&(i+=Math.round(gefs.aircraft.animationValue.altitude/4e3)),h(n,i)}function v(t,a){var e=new Date,n=e.getHours(),i=e.getMinutes();return n+=t,i+=Number(a),h(n,i)}function m(t){var a,e=gefs.aircraft.llaLocation||[0,0,0],n=fmc.waypoints.nextWaypoint||0,i=fmc.waypoints.route;if(0!==i.length&&fmc.waypoints.nextWaypoint){a=fmc.math.getDistance(e[0],e[1],i[n-1][1],i[n-1][2]);for(var d=n;t>d&&d<i.length;d++)a+=fmc.math.getDistance(i[d-1][1],i[d-1][2],i[d][1],i[d][2]);t>i.length&&(a+=fmc.math.getDistance(i[i.length-1][1],i[i.length-1][2],W[1],W[2]))}else a=fmc.math.getDistance(e[0],e[1],W[1],W[2]);return a}function x(t){var a;return a=0>t?t/-1e3*3.4:t/1e3*2.5}function b(t){var a=gefs.aircraft.animationValue.kcas,e=.107917*Math.pow(Math.E,.0128693*a),n=fmc.math.toRadians(t);return e*Math.tan(n/2)+.2}function y(){k?(k=!1,$("#vnavButton").removeClass("btn btn-warning").addClass("btn"),clearInterval(A)):M?(k=!0,$("#vnavButton").removeClass("btn").addClass("btn btn-warning"),A=setInterval(e,5e3)):alert("Please enter a cruising altitude.")}function C(){$("#tSpd").hasClass("btn-warning")?($("#tSpd").removeClass("btn-warning").addClass("btn-default").text("OFF"),spdControl=!1):($("#tSpd").removeClass("btn-default").addClass("btn-warning").text("ON"),spdControl=!0)}function w(){$("#logData tr").remove(".data")}var I,M,k=!1,W=[],D="climb",F=!1,R=0,T={climb:[[1500,4e3,210,3e3],[4e3,1e4,250,2500],[1e4,18e3,295,2200],[18e3,27e3,295,1800],[27e3,3e4,295,1500],[3e4,1e99,.78,1500]],descent:[[3e4,1e99,.78,-2300],[18e3,3e4,295,-2100],[12e3,18e3,280,-1800],[1e4,12e3,250,-1500]]};window.feetToNM=1/6076,window.nmToFeet=6076,window.fmc={},fmc.math={toRadians:function(t){return t*Math.PI/180},toDegrees:function(t){return 180*t/Math.PI},getGroundSpeed:function(){var t=gefs.aircraft.animationValue.ktas,a=60*gefs.aircraft.animationValue.climbrate*feetToNM;return Math.sqrt(t*t-a*a)},getDistance:function(t,a,e,n){var i=fmc.math,d=i.toRadians(e-t),p=i.toRadians(n-a);t=i.toRadians(t),e=i.toRadians(e);var s=Math.sin(d/2)*Math.sin(d/2)+Math.cos(t)*Math.cos(e)*Math.sin(p/2)*Math.sin(p/2),r=2*Math.atan2(Math.sqrt(s),Math.sqrt(1-s));return i.earthRadiusNM*r},getBearing:function(t,a,e,n){var i=fmc.math;t=i.toRadians(t),e=i.toRadians(e),a=i.toRadians(a),n=i.toRadians(n);var d=Math.sin(n-a)*Math.cos(e),p=Math.cos(t)*Math.sin(e)-Math.sin(t)*Math.cos(e)*Math.cos(n-a),s=i.toDegrees(Math.atan2(d,p));return s},getClimbrate:function(t,a){var e=fmc.math.getGroundSpeed(),n=100*Math.round(e*(t/(a*nmToFeet))*nmToFeet/60/100);return n},earthRadiusNM:3440.06},fmc.waypoints={input:"",route:[],nextWaypoint:"",makeFixesArray:function(){var t=[],a=$("#departureInput").val();a&&t.push(a),$(".waypoint td:first-child div > input").each(function(){t.push($(this).val())});var e=$("#arrivalInput").val();return e&&t.push(e),t},toFixesString:function(){return fmc.waypoints.makeFixesArray().join(" ")},toRouteString:function(){return JSON.stringify([$("#departureInput").val(),$("#arrivalInput").val(),$("#flightNumInput").val(),fmc.waypoints.route])},getCoords:function(t){return autopilot_pp.require("icaoairports")[t]?autopilot_pp.require("icaoairports")[t]:autopilot_pp.require("waypoints")[t]?autopilot_pp.require("waypoints")[t]:!1},formatCoords:function(t){if(t.indexOf(" ")>-1){var a,e=t.split(" "),n=Number(e[0]),i=Number(e[1])/60;return a=0>n?n-i:n+i}return Number(t)},toRoute:function(t){if(0!==t.indexOf('["')){var a,e=(t.indexOf("fpl="),!0),n=$("#wptDeparture")[0].checked,i=$("#wptArrival")[0].checked,d=$("#waypoints tbody tr").length-1,p=[];p=t.trim().toUpperCase().split(" ");for(var s=0;s<p.length;s++)(p[s].length>5||p[s].length<1||!/^\w+$/.test(p[s]))&&(e=!1);if(e){for(var s=0;d>s;s++)fmc.waypoints.removeWaypoint(1);if(fmc.waypoints.route=[],n){var r=p[0];$("#departureInput").val(r).change(),a=1}else a=0,$("#departureInput").val("").change();for(var s=0;s+a<p.length;s++){fmc.waypoints.addWaypoint();var r=p[s+a];$("#waypoints input.wpt:eq("+s+")").val(r).change()}if(i){var r=p[p.length-1];$("#arrivalInput").val(r).change()}}else alert("Invalid Waypoints Input")}else fmc.waypoints.loadFromSave(t)},addWaypoint:function(){var t=fmc.waypoints;t.route.length++;t.route.length;t.route[t.route.length-1]=[],$("<tr>").addClass("waypoint").append($("<td>").append($("<div>").addClass("input-prepend input-append").append($("<input>").addClass("input-medium").addClass("wpt").css("width","75px").attr("type","text").attr("placeholder","Fix/Apt.").change(function(){var a=$(this).val(),e=t.getCoords(a),n=$(this).parents().eq(2).index()-1;e?($(this).parents().eq(2).children(".position").children("div").children(".lat").val(e[0]),$(this).parents().eq(2).children(".position").children("div").children(".lon").val(e[1]),t.route[n]=[a,e[0],e[1],void 0,!0]):(t.route[n][0]=a,t.route[n][4]=!1)}))),$("<td>").addClass("position").append($("<div>").addClass("input-prepend input-append").append($("<input>").addClass("input-medium lat").css("width","80px").attr({type:"text",tabindex:"-1"}).change(function(){var a=$(this).parents().eq(2).index()-1;t.route[a][1]=t.formatCoords($(this).val()),t.route[a][4]=!1}),$("<input>").addClass("input-medium lon").css("width","80px").attr({type:"text",tabindex:"-1"}).change(function(){var a=$(this).parents().eq(2).index()-1;t.route[a][2]=t.formatCoords($(this).val()),t.route[a][4]=!1}))),$("<td>").addClass("altitude").append($("<div>").addClass("input-prepend input-append").append($("<input>").addClass("input-medium alt").css("width","40px").attr({type:"text",tabindex:"-1",placeholder:"Ft."}).change(function(){var a=$(this).parents().eq(2).index()-1;t.route[a][3]=Number($(this).val())}))),$("<td>").append($("<div>").addClass("input-prepend input-append").append($("<button>").attr("type","button").addClass("btn btn-standard activate").text("Activate").click(function(){var t=$(this).parents().eq(2).index();l(t)}),$("<button>").attr("type","button").addClass("btn btn-info").append($("<i>").addClass("icon-arrow-up")).click(function(){var t=$(this).parents().eq(2);fmc.waypoints.shiftWaypoint(t,t.index(),"up")}),$("<button>").attr("type","button").addClass("btn btn-info").append($("<i>").addClass("icon-arrow-down")).click(function(){var t=$(this).parents().eq(2);fmc.waypoints.shiftWaypoint(t,t.index(),"down")}),$("<button>").attr("type","button").addClass("btn btn-danger").append($("<i>").addClass("icon-remove")).click(function(){var a=$(this).parents().eq(2).index();t.removeWaypoint(a)})))).appendTo("#waypoints")},removeWaypoint:function(t){$("#waypoints tr:nth-child("+(t+1)+")").remove(),fmc.waypoints.route.splice(t-1,1),fmc.waypoints.nextWaypoint==t&&(fmc.waypoints.nextWaypoint=null)},saveData:function(){if(fmc.waypoints.route.length<1||!fmc.waypoints.route[0][0])alert("There is no route to save");else{localStorage.removeItem("fmcWaypoints");var t=fmc.waypoints.toRouteString();localStorage.setItem("fmcWaypoints",t)}},loadFromSave:function(t){t=t||localStorage.getItem("fmcWaypoints");var a=fmc.waypoints,e=JSON.parse(t);if(localStorage.removeItem("fmcWaypoints"),e){a.route=[];for(var n=e[3],i=$("#waypoints tbody tr").length-1,d=0;i>d;d++)a.removeWaypoint(1);n.forEach(function(t){t[3]&&null!=t[3]&&0!=t[3]||(t[3]=void 0)}),e[0]&&$("#departureInput").val(e[0]).change(),e[1]&&$("#arrivalInput").val(e[1]).change(),e[2]&&$("#flightNumInput").val(e[2]).change();for(var d=0;d<n.length;d++)a.addWaypoint(),$("#waypoints input.wpt:eq("+d+")").val(n[d][0]).change(),n[d][4]&&$("#waypoints input.lat:eq("+d+")").val()||($("#waypoints input.lat:eq("+d+")").val(n[d][1]).change(),$("#waypoints input.lon:eq("+d+")").val(n[d][2]).change()),n[d][3]&&$("#waypoints input.alt:eq("+d+")").val(n[d][3]).change();a.saveData()}else alert("You did not save the waypoints or you cleared the browser's cache")},shiftWaypoint:function(t,a,e){var n=fmc.waypoints;"up"==e&&1==a||"down"==e&&a==n.route.length||("up"==e?(n.route.move(a-1,a-2),t.insertBefore(t.prev()),n.nextWaypoint==a?n.nextWaypoint=a-1:n.nextWaypoint==a-1&&(n.nextWaypoint=a+1)):(n.route.move(a-1,a),t.insertAfter(t.next()),n.nextWaypoint==a?n.nextWaypoint=a+1:n.nextWaypoint==a+1&&(n.nextWaypoint=a-1)))}},fmc.vnav={profile:gefs.aircraft.setup.fmc||T},fmc.ui={externalDist:$("<div>").addClass("setup-section").css("padding-bottom","0px").append($("<div>").addClass("input-prepend input-append").css("margin-bottom","4px").append($("<span>").addClass("add-on").text("Dest"),$("<span>").addClass("add-on").css("background-color","white").css("width","53px").append($("<div>").attr("id","externaldist")))).appendTo("td.gefs-f-standard"),button:$("<button>").addClass("btn btn-success gefs-stopPropagation").attr("type","button").attr("data-toggle","modal").attr("data-target","#fmcModal").css("margin-left","1px").text("FMC ").append($("<i>").addClass("icon-list-alt")).appendTo("div.setup-section:nth-child(2)"),modal:$("<div>").addClass("modal hide gefs-stopPropagation").attr("data-backdrop","static").attr("id","fmcModal").attr("tabindex","-1").attr("role","dialog").attr("aria-labelledby","fmcDialogBoxLabel").attr("aria-hidden","true").css("width","590px").append($("<div>").addClass("modal-dialog").append($("<div>").addClass("modal-content").append($("<div>").addClass("modal-header").append($("<button>").addClass("close").attr("type","button").attr("data-dismiss","modal").attr("aria-hidden","true").text("×"),$("<h3>").addClass("modal-title").attr("id","myModalLabel").css("text-align","center").text("Flight Management Computer")),$("<div>").addClass("modal-body").append($("<ul>").addClass("nav nav-tabs").append($("<li>").addClass("active").append('<a href="#rte" data-toggle="tab">RTE</a>'),$("<li>").append('<a href="#arr" data-toggle="tab">DEP/ARR</a>'),$("<li>").append('<a href="#vnav" data-toggle="tab">VNAV</a>'),$("<li>").append('<a href="#prog" data-toggle="tab">PROG</a>'),$("<li>").append('<a href="#load" data-toggle="tab">LOAD</a>'),$("<li>").append('<a href="#log" data-toggle="tab">LOG</a>')),$("<div>").addClass("tab-content").css("padding","5px").append($("<div>").addClass("tab-pane active").attr("id","rte").append($("<table>").append($("<tr>").append($("<table>").append($("<tr>").append($("<td>").css("padding","5px").append($("<div>").addClass("input-prepend input-append").append($("<span>").addClass("add-on").text("Departure"),$("<input>").addClass("input-mini").attr("id","departureInput").attr("type","text").attr("placeholder","ICAO"))),$("<td>").css("padding","5px").append($("<div>").addClass("input-prepend input-append").append($("<span>").addClass("add-on").text("Arrival"),$("<input>").addClass("input-mini").attr("type","text").attr("id","arrivalInput").attr("placeholder","ICAO").change(function(){var t=$(this).val(),a=fmc.waypoints.getCoords(t);a?W=[t,a[0],a[1]]:(alert("Invalid Airport code"),$(this).val(""))}))),$("<td>").css("padding","5px").append($("<div>").addClass("input-prepend input-append").append($("<span>").addClass("add-on").text("Flight #"),$("<input>").addClass("input-mini").attr("id","flightNumInput").css("width","80px").attr("type","text")))))),$("<tr>").append($("<table>").attr("id","waypoints").append($("<tr>").append($("<td>").append("<th>Waypoints</th>"),$("<td>").append("<th>Position</th>"),$("<td>").append("<th>Altitude</th>"),$("<td>").append("<th>Actions</th>")))),$("<tr>").append($("<div>").attr("id","waypointsAddDel").append($("<table>").append($("<tr>").append($("<td>").append($("<button>").addClass("btn btn-primary").attr("type","button").text("Add Waypoint ").append($("<i>").addClass("icon-plus")).click(function(){fmc.waypoints.addWaypoint()}).css("margin-right","3px")))))),$("<tr>").append($("<div>").attr("id","saveRoute").append($("<table>").append($("<tr>").append($("<td>").append($("<button>").addClass("btn btn-info").attr("type","button").text("Save Route ").append($("<i>").addClass("icon-file icon-white")).click(function(){fmc.waypoints.saveData()}).css("margin-right","3px"),$("<button>").addClass("btn btn-info").attr("type","button").text("Retrieve Route ").append($("<i>").addClass("icon-refresh icon-white")).click(function(){fmc.waypoints.loadFromSave()})))))))),$("<div>").addClass("tab-pane").attr("id","arr").append($("<table>").append($("<tr>").append($("<td>").append($("<div>").addClass("input-prepend input-append").append($("<span>").addClass("add-on").text("TOD Dist."),$("<input>").attr("id","todInput").attr("type","number").attr("min","0").attr("placeholder","nm").css("width","38px").change(function(){I=$(this).val()}))),$("<td>").append($("<div>").addClass("input-prepend input-append").append($("<span>").addClass("add-on").text("Automatically calculate TOD"),$("<button>").addClass("btn btn-standard").attr("type","button").text("OFF").click(function(){F?($(this).removeClass("btn btn-warning").addClass("btn btn-standard").text("OFF"),F=!1):($(this).removeClass("btn btn-standard").addClass("btn btn-warning").text("ON"),F=!0)})))),$("<tr>").append($("<td>").append($("<div>").addClass("input-prepend input-append").append($("<span>").addClass("add-on").text("Arrival Field Elev."),$("<input>").attr("type","number").attr("placeholder","ft.").css("width","55px").change(function(){R=Number($(this).val())})))))),$("<div>").addClass("tab-pane").attr("id","vnav").append($("<table>").append($("<tr>").append($("<td>").append($("<div>").addClass("input-prepend input-append").append($("<button>").addClass("btn").attr("id","vnavButton").text("VNAV ").append($("<i>").addClass("icon icon-resize-vertical")).click(function(){y()}),$("<span>").addClass("add-on").text("Cruise Alt."),$("<input>").attr("type","number").attr("step","100").attr("min","0").attr("max","100000").attr("placeholder","ft").css("width","80px").change(function(){M=Number($(this).val())})))),$("<tr>").append($("<td>").append($("<div>").addClass("input-prepend input-append").append($("<span>").addClass("add-on").text("Phase"),$("<button>").addClass("btn btn-info").attr("id","phaseBtn").text("Climb").css("height","30px").css("width","77px").click(function(){$("#phaseLock").hasClass("btn-default")&&("climb"==D?($(this).text("Cruise"),D="cruise"):"cruise"==D?($(this).text("Descent"),D="descent"):($(this).text("Climb"),D="climb"))}),$("<button>").addClass("btn btn-default").attr("id","phaseLock").append($('<i class="icon-lock"></i>')).click(function(){$(this).hasClass("btn-default")?$(this).removeClass("btn-default").addClass("btn-danger"):$(this).removeClass("btn-danger").addClass("btn-default")}))),$("<td>").append($("<div>").addClass("input-prepend input-append").append($("<span>").addClass("add-on").text("SPD Control"),$("<button>").addClass("btn btn-warning").attr("id","tSpd").text("ON").css("width","60px").click(function(){C()})))))),$("<div>").addClass("tab-pane").attr("id","prog").append($("<table>").append($("<tr>").append($("<td>").append($("<div>").addClass("input-prepend input-append").append($("<span>").addClass("add-on").text("Dest"),$("<span>").addClass("add-on").css("background-color","white").css("width","53px").append($("<div>").attr("id","flightdist")),$("<span>").addClass("add-on").css("background-color","white").css("width","50px").append($("<table>").css({position:"relative",top:"-6px"}).append($("<tr>").append($("<td>").append($("<div>").attr("id","flightete").css("font-size","70%").css("height","10px"))),$("<tr>").append($("<td>").append($("<div>").attr("id","flighteta").css("font-size","70%").css("height","10px"))))))),$("<td>").append($("<div>").addClass("input-prepend input-append").append($("<span>").addClass("add-on").text("TOD"),$("<span>").addClass("add-on").css("background-color","white").css("width","53px").append($("<div>").attr("id","toddist")),$("<span>").addClass("add-on").css("background-color","white").css("width","50px").append($("<table>").css({position:"relative",top:"-6px"}).append($("<tr>").append($("<td>").append($("<div>").attr("id","todete").css("font-size","70%").css("height","10px"))),$("<tr>").append($("<td>").append($("<div>").attr("id","todeta").css("font-size","70%").css("height","10px")))))))),$("<tr>").append($("<td>").append($("<div>").addClass("input-prepend input-append").append($("<span>").addClass("add-on").text("Next Waypoint ").append($("<i>").addClass("icon-map-marker")),$("<span>").addClass("add-on").css("background-color","white").css("width","53px").append($("<div>").attr("id","nextDist")),$("<span>").addClass("add-on").css("background-color","white").css("width","53px").append($("<div>").attr("id","nextETE"))))))),$("<div>").addClass("tab-pane").attr("id","load").append($("<th>Enter waypoints seperated by spaces or a generated route</th>"),$("<form>").attr("action","javascript:fmc.waypoints.toRoute(fmc.waypoints.input);").addClass("form-horizontal").append($("<fieldset>").append($("<div>").addClass("input-prepend input-append").append($("<span>").addClass("add-on").text("Waypoints ").append($("<i>").addClass("icon-pencil")),$("<input>").attr("type","text").addClass("input-xlarge gefs-stopPropagation").change(function(){fmc.waypoints.input=$(this).val()})),$('<label class = "checkbox"><input type="checkbox" id="wptDeparture" value="true" checked> First waypoint is departure airport</label>'),$('<label class = "checkbox"><input type="checkbox" id="wptArrival" value="true" checked> Last waypoint is arrival airport</label>'),$("<button>").attr("type","submit").addClass("btn btn-primary").text("Load Route ").append($("<i>").addClass("icon-play"))),$("<fieldset>").css("margin-top","10px").append($("<button>").addClass("btn btn-warning").attr("type","button").text("Generate").click(function(){$("#generateRoute").val(fmc.waypoints.toRouteString()).change()}),$("<button>").addClass("btn btn-warning").attr("type","button").css("margin-left","5px").text("Clear").click(function(){$("#generateRoute").val("").change()}),$("<div>").css("margin-top","10px").append($("<textarea>").attr("id","generateRoute").attr("placeholder","Generate route. Save it or share it").css("margin","0px 0px 10px").css("width","350px").css("height","65px").css("resize","none"))))),$("<div>").addClass("tab-pane").attr("id","log").append($("<table>").attr("id","logData").append($("<tr>").append($("<th>Time</th>").css("padding","0px 10px 0px 10px"),$("<th>Speed</th>").css("padding","0px 10px 0px 10px"),$("<th>Heading</th>").css("padding","0px 10px 0px 10px"),$("<th>Altitude</th>").css("padding","0px 10px 0px 10px"),$("<th>Lat.</th>").css("padding","0px 10px 0px 10px"),$("<th>Lon.</th>").css("padding","0px 10px 0px 10px"),$("<th>FPS</th>").css("padding","0px 10px 0px 10px"),$("<th>Other</th>").css("padding","0px 10px 0px 10px"))),$("<button>").addClass("btn btn-danger").attr("type","button").click(function(){w()}).text("Clear Log ").append($("<i>").addClass("icon-remove-circle"))))),$("<div>").addClass("modal-footer").append($("<button>").addClass("btn btn-default").attr("type","button").attr("data-dismiss","modal").text("Close"),$("<button>").addClass("btn btn-primary").attr("type","button").text("Save changes ").append($("<i>").addClass("icon-hdd")))))).appendTo("body")};var A,V=(setInterval(t,5e3),setInterval(a,5e3)),S=setInterval(n,12e4),N=setInterval(i,12e3),q=(setInterval(d,5e3),setInterval(p,15e3));Array.prototype.move=function(t,a){if(a>=this.length)for(var e=a-this.length;e--+1;)this.push(void 0);return this.splice(a,0,this.splice(t,1)[0]),this};var O=Aircraft.prototype.load;Aircraft.prototype.load=function(t,a,e){var n=gefs.aircraft.object3d._children;O.call(this,t,a,e);var i=setInterval(function(){n!==gefs.aircraft.object3d._children&&(clearInterval(i),fmc.vnav.profile=gefs.aircraft.setup.fmc||T)},16)},gefs.resetFlight=function(){window.confirm("Reset Flight?")&&gefs.lastFlightCoordinates&&(gefs.flyTo(gefs.lastFlightCoordinates,!0),n("Flight reset"))},gefs.togglePause=function(){gefs.pause?(gefs.undoPause(),n("Flight resumed")):(n("Flight paused"),gefs.doPause())},fmc.waypoints.addWaypoint(),$("#fmcModal").modal({backdrop:!1,show:!1}),$("#fmcModal").keyup(function(t){t.stopImmediatePropagation()})});