# A320 RM panel
# merspieler

# Copyright (c) 2019 merspieler

# Distribute under the terms of GPLv2.

var _default_instrument_mhz = props.globals.getNode("instrumentation/comm[0]/frequencies/standby-mhz");
var _default_instrument_chan = props.globals.getNode("instrumentation/comm[0]/frequencies/standby-channel");

var rmpClass = {
	new: func(instance) {
		var m = {parents:[rmpClass]};
		m._title = "RMP " ~ instance;
		m._gfd = nil;
		m._canvas = nil;
		m._timer = maketimer(0.1, m, rmpClass._timerf);
		m._timerMhzUp = maketimer(0.1, m, rmpClass._mhzUp);
		m._timerMhzDn = maketimer(0.1, m, rmpClass._mhzDn);
		m._timerKhzUp = maketimer(0.1, m, rmpClass._khzUp);
		m._timerKhzDn = maketimer(0.1, m, rmpClass._khzDn);
		m._instance = instance;

		# Get nodes for this rmp
		m._prop_power = props.globals.getNode("controls/radio/rmp[" ~ (instance - 1) ~ "]/on");
		m._prop_am_active = props.globals.getNode("systems/radio/rmp[" ~ (instance - 1) ~ "]/am-active");
		m._prop_bfo_active = props.globals.getNode("systems/radio/rmp[" ~ (instance - 1) ~ "]/bfo-active");
		m._prop_hf1_stby = props.globals.getNode("systems/radio/rmp[" ~ (instance - 1) ~ "]/hf1-standby");
		m._prop_hf2_stby = props.globals.getNode("systems/radio/rmp[" ~ (instance - 1) ~ "]/hf2-standby");
		m._prop_nav = props.globals.getNode("systems/radio/rmp[" ~ (instance - 1) ~ "]/nav");
		m._prop_sel_light = props.globals.getNode("systems/radio/rmp[" ~ (instance - 1) ~ "]/sel-light");
		m._prop_sel_chan = props.globals.getNode("systems/radio/rmp[" ~ (instance - 1) ~ "]/sel_chan");
		m._prop_vhf1_stby = props.globals.getNode("systems/radio/rmp[" ~ (instance - 1) ~ "]/vhf1-standby");
		m._prop_vhf2_stby = props.globals.getNode("systems/radio/rmp[" ~ (instance - 1) ~ "]/vhf2-standby");
		m._prop_vhf3_stby = props.globals.getNode("systems/radio/rmp[" ~ (instance - 1) ~ "]/vhf3-standby");

		m._prop_display_active = props.globals.getNode("controls/radio/rmp[" ~ (instance - 1) ~ "]/active-display");
		m._prop_display_standby = props.globals.getNode("controls/radio/rmp[" ~ (instance - 1) ~ "]/standby-display");

		# Power source depending on RMP number
		if (instance == 1) {
			m._prop_power_source = systems.ELEC.Bus.dcEss;
		} else if (instance == 2) {
			m._prop_power_source = systems.ELEC.Bus.dc2;
		} else {
			m._prop_power_source = systems.ELEC.Bus.dc1;
		}
		return m;
	},
	close: func() {
		me._timer.stop();
		me._timerMhzUp.stop();
		me._timerMhzDn.stop();
		me._timerKhzUp.stop();
		me._timerKhzDn.stop();

		me._gfd.del();
		me._gfd = nil;
	},
	openDialog: func() {
		me._gfd = canvas.Window.new([416,255], "dialog");
		me._gfd._onClose = func() {rmpDialog._onClose();}

		me._gfd.set("title", me._title);
		me._canvas  = me._gfd.createCanvas();
		me._root = me._canvas.createGroup();

		me._svg = me._root.createChild("group");
		canvas.parsesvg(me._svg, "Aircraft/A320-family/gui/dialogs/rmp.svg");
	
		me._Transfer = me._svg.getElementById("Transfer-hb");
		me._VHF1 = me._svg.getElementById("VHF1-hb");
		me._VHF2 = me._svg.getElementById("VHF2-hb");
		me._VHF3 = me._svg.getElementById("VHF3-hb");
		me._HF1 = me._svg.getElementById("HF1-hb");
		me._HF2 = me._svg.getElementById("HF2-hb");
		me._AM = me._svg.getElementById("AM-hb");
		me._NAV = me._svg.getElementById("NAV-hb");
		me._VOR = me._svg.getElementById("VOR-hb");
		me._LS = me._svg.getElementById("LS-hb");
		me._ADF = me._svg.getElementById("ADF-hb");
		me._BFO = me._svg.getElementById("BFO-hb");

		# Indicators
		me._VHF1_ind = me._svg.getElementById("VHF1-ind");
		me._VHF2_ind = me._svg.getElementById("VHF2-ind");
		me._VHF3_ind = me._svg.getElementById("VHF3-ind");
		me._HF1_ind = me._svg.getElementById("HF1-ind");
		me._HF2_ind = me._svg.getElementById("HF2-ind");
		me._AM_ind = me._svg.getElementById("AM-ind");
		me._NAV_ind = me._svg.getElementById("NAV-ind");
		me._VOR_ind = me._svg.getElementById("VOR-ind");
		me._LS_ind = me._svg.getElementById("LS-ind");
		me._ADF_ind = me._svg.getElementById("ADF-ind");
		me._BFO_ind = me._svg.getElementById("BFO-ind");

		me._Active = me._svg.getElementById("Active-freq");
		me._STBY = me._svg.getElementById("STBY-freq");
		me._Sel = me._svg.getElementById("Sel");
		me._Sel_lt = me._svg.getElementById("Sel-lt");

		me._Power_off_hb = me._svg.getElementById("Power-off-hb");
		me._Power_on_hb = me._svg.getElementById("Power-on-hb");
		me._Power_off = me._svg.getElementById("Power-off");
		me._Power_on = me._svg.getElementById("Power-on");

		me._Inc_mhz = me._svg.getElementById("Inc-mhz");
		me._Dec_mhz = me._svg.getElementById("Dec-mhz");
		me._Inc_khz = me._svg.getElementById("Inc-khz");
		me._Dec_khz = me._svg.getElementById("Dec-khz");

		me._Power_on_hb.addEventListener("click", func() {
			me._Power_on.show();
			me._Power_off.hide();
			me._prop_power.setValue(1);
		});

		me._Power_off_hb.addEventListener("click", func() {
			me._Power_on.hide();
			me._Power_off.show();
			me._prop_power.setValue(0);
		});

		me._Transfer.addEventListener("click", func() {
			if (me._prop_power_source.getValue() >= 25 and me._prop_power.getValue() == 1)
			{
				rmp.transfer(me._instance);
			}
		});

		me._VHF1.addEventListener("click", func() {
			if (me._prop_power_source.getValue() >= 25 and me._prop_power.getValue() == 1)
			{
				me._prop_sel_chan.setValue("vhf1");
			}
		});

		me._VHF2.addEventListener("click", func() {
			if (me._prop_power_source.getValue() >= 25 and me._prop_power.getValue() == 1)
			{
				me._prop_sel_chan.setValue("vhf2");
			}
		});

		me._VHF3.addEventListener("click", func() {
			if (me._prop_power_source.getValue() >= 25 and me._prop_power.getValue() == 1)
			{
				me._prop_sel_chan.setValue("vhf3");
			}
		});

		me._Inc_mhz.addEventListener("mousedown", func() {
			me._timerMhzUp.start();
		});

		me._Dec_mhz.addEventListener("mousedown", func() {
			me._timerMhzDn.start();
		});

		me._Inc_khz.addEventListener("mousedown", func() {
			me._timerKhzUp.start();
		});

		me._Dec_khz.addEventListener("mousedown", func() {
			me._timerKhzDn.start();
		});

		me._Inc_khz.addEventListener("mouseup", func() {
			me._timerKhzUp.stop();
		});

		me._Dec_khz.addEventListener("mouseup", func() {
			me._timerKhzDn.stop();
		});

		me._Inc_mhz.addEventListener("mouseup", func() {
			me._timerMhzUp.stop();
		});

		me._Dec_mhz.addEventListener("mouseup", func() {
			me._timerMhzDn.stop();
		});

		me._timerf();
		me._timer.start();
	},
	_timerf: func() {
		var pwr_switch = me._prop_power.getValue();

		if (pwr_switch == 1) {
			me._Power_on.show();
			me._Power_off.hide();
		} else {
			me._Power_on.hide();
			me._Power_off.show();
		}

		if (pwr_switch == 1 and me._prop_power_source.getValue() >= 25) {
			me._Active.show();
			me._STBY.show();

			me._Active.setText(me._prop_display_active.getValue());
			me._STBY.setText(me._prop_display_standby.getValue());

			if (me._prop_sel_light.getValue() == 1) {
				me._Sel.setColor(1, 0.675, 0.325);
				me._Sel_lt.setColor(1, 0.675, 0.325);
				me._Sel_lt.setColorFill(1, 0.675, 0.325);
			} else {
				me._Sel.setColor(0.204, 0.176, 0.141);
				me._Sel_lt.setColor(0.204, 0.176, 0.141);
				me._Sel_lt.setColorFill(0.204, 0.176, 0.141);
			}

			var chan_sel = me._prop_sel_chan.getValue();

			if (chan_sel == "vhf1") {
				me._VHF1_ind.setColorFill(0, 0.635, 0.165);
			} else {
				me._VHF1_ind.setColorFill(0.125, 0.125, 0.125);
			}

			if (chan_sel == "vhf2") {
				me._VHF2_ind.setColorFill(0, 0.635, 0.165);
			} else {
				me._VHF2_ind.setColorFill(0.125, 0.125, 0.125);
			}

			if (chan_sel == "vhf3") {
				me._VHF3_ind.setColorFill(0, 0.635, 0.165);
			} else {
				me._VHF3_ind.setColorFill(0.125, 0.125, 0.125);
			}
		} else {
			me._Active.hide();
			me._STBY.hide();
			me._Sel.setColor(0.204, 0.176, 0.141);
			me._Sel_lt.setColor(0.204, 0.176, 0.141);
			me._Sel_lt.setColorFill(0.204, 0.176, 0.141);
			me._VHF1_ind.setColorFill(0.125, 0.125, 0.125);
			me._VHF2_ind.setColorFill(0.125, 0.125, 0.125);
			me._VHF3_ind.setColorFill(0.125, 0.125, 0.125);
			me._HF1_ind.setColorFill(0.125, 0.125, 0.125);
			me._HF2_ind.setColorFill(0.125, 0.125, 0.125);
			me._AM_ind.setColorFill(0.125, 0.125, 0.125);
			me._NAV_ind.setColorFill(0.125, 0.125, 0.125);
			me._VOR_ind.setColorFill(0.125, 0.125, 0.125);
			me._LS_ind.setColorFill(0.125, 0.125, 0.125);
			me._ADF_ind.setColorFill(0.125, 0.125, 0.125);
			me._BFO_ind.setColorFill(0.125, 0.125, 0.125);
		}
	},
	_mhzUp: func() {
		if (me._prop_power_source.getValue() >= 25 and me._prop_power.getValue() == 1) {
			var chan_sel = me._prop_sel_chan.getValue();
			if (chan_sel == "vhf1") {
				var freq = me._prop_vhf1_stby.getValue();
				if (freq >= 136) {
					freq = freq - 18;
				} else {
					freq = freq + 1;
				}
				me._prop_vhf1_stby.setValue(freq);
			} else if (chan_sel == "vhf2") {
				var freq = me._prop_vhf2_stby.getValue();
				if (freq >= 136) {
					freq = freq - 18;
				} else {
					freq = freq + 1;
				}
				me._prop_vhf2_stby.setValue(freq);
			} else if (chan_sel == "vhf3") {
				var freq = me._prop_vhf3_stby.getValue();
				if (freq >= 136) {
					freq = freq - 18;
				} else {
					freq = freq + 1;
				}
				me._prop_vhf3_stby.setValue(freq);
			}
		}
	},
	_mhzDn: func() {
		if (me._prop_power_source.getValue() >= 25 and me._prop_power.getValue() == 1) {
			var chan_sel = me._prop_sel_chan.getValue();
			if (chan_sel == "vhf1") {
				var freq = me._prop_vhf1_stby.getValue();
				if (freq < 119) {
					freq = freq + 18;
				} else {
					freq = freq - 1;
				}
				me._prop_vhf1_stby.setValue(freq);
			} else if (chan_sel == "vhf2") {
				var freq = me._prop_vhf2_stby.getValue();
				if (freq < 119) {
					freq = freq + 18;
				} else {
					freq = freq - 1;
				}
				me._prop_vhf2_stby.setValue(freq);
			} else if (chan_sel == "vhf3") {
				var freq = me._prop_vhf3_stby.getValue();
				if (freq < 119) {
					freq = freq + 18;
				} else {
					freq = freq - 1;
				}
				me._prop_vhf3_stby.setValue(freq);
			}
		}
	},
	# We use a little hack to get 8.33KHz spacing working:
 	#    First we assign our current STBY freq we want to adjust to the default instrument.
 	#    Then we change the channel there.
 	#    Finally we assign the value back to out own prop.
	_khzUp: func() {
		if (me._prop_power_source.getValue() >= 25 and me._prop_power.getValue() == 1) {
			var chan_sel = me._prop_sel_chan.getValue();
			if (chan_sel == "vhf1") {
				_default_instrument_mhz.setValue(me._prop_vhf1_stby.getValue());
				var chan = _default_instrument_chan.getValue();
				chan = chan + 1;
				_default_instrument_chan.setValue(chan);
				me._prop_vhf1_stby.setValue(_default_instrument_mhz.getValue());
			} else if (chan_sel == "vhf2") {
				_default_instrument_mhz.setValue(me._prop_vhf2_stby.getValue());
				var chan = _default_instrument_chan.getValue();
				chan = chan + 1;
				_default_instrument_chan.setValue(chan);
				me._prop_vhf2_stby.setValue(_default_instrument_mhz.getValue());
			} else if (chan_sel == "vhf3") {
				_default_instrument_mhz.setValue(me._prop_vhf3_stby.getValue());
				var chan = _default_instrument_chan.getValue();
				chan = chan + 1;
				_default_instrument_chan.setValue(chan);
				me._prop_vhf3_stby.setValue(_default_instrument_mhz.getValue());
			}
		}
	},
	_khzDn: func() {
		if (me._prop_power_source.getValue() >= 25 and me._prop_power.getValue() == 1) {
			var chan_sel = me._prop_sel_chan.getValue();
			if (chan_sel == "vhf1") {
				_default_instrument_mhz.setValue(me._prop_vhf1_stby.getValue());
				var chan = _default_instrument_chan.getValue();
				chan = chan - 1;
				_default_instrument_chan.setValue(chan);
				me._prop_vhf1_stby.setValue(_default_instrument_mhz.getValue());
			} else if (chan_sel == "vhf2") {
				_default_instrument_mhz.setValue(me._prop_vhf2_stby.getValue());
				var chan = _default_instrument_chan.getValue();
				chan = chan - 1;
				_default_instrument_chan.setValue(chan);
				me._prop_vhf2_stby.setValue(_default_instrument_mhz.getValue());
			} else if (chan_sel == "vhf3") {
				_default_instrument_mhz.setValue(me._prop_vhf3_stby.getValue());
				var chan = _default_instrument_chan.getValue();
				chan = chan - 1;
				_default_instrument_chan.setValue(chan);
				me._prop_vhf3_stby.setValue(_default_instrument_mhz.getValue());
			}
		}
	},
	_onClose: func() {
		me.close();
	},
};

var rmp1Dialog = rmpClass.new(1);
var rmp2Dialog = rmpClass.new(2);
var rmp3Dialog = rmpClass.new(3);