<%#
 Copyright 2010 Jo-Philipp Wich <jow@openwrt.org>
 Licensed to the public under the Apache License 2.0.
-%>

<%+header%>

<%
local fs   = require "nixio.fs"
local has_ping6 = fs.access("/bin/ping6") or fs.access("/usr/bin/ping6")
local has_traceroute6 = fs.access("/bin/traceroute6") or fs.access("/usr/bin/traceroute6")
local board_name = fs.readfile("/tmp/sysinfo/board_name",64)
local has_eth0 = nil~=string.find(board_name,"G520") or nil~=string.find(board_name,"X300")
local has_eth1 = nil == string.find(board_name,"X300")
--luci.sys.exec("logger '" .. board_name .. tostring(has_eth0) .. "," .. tostring(has_eth1) .."'")
local dns_host = luci.config.diag and luci.config.diag.dns or ""
local ping_host = luci.config.diag and luci.config.diag.ping or ""
local route_host = luci.config.diag and luci.config.diag.route or ""
%>

<script type="text/javascript">//<![CDATA[
	var stxhr = new XHR();
	function get_phytest(interface)
	{
		var tool = "phytestresult";
		var param = interface;
		var legend = document.getElementById('diag-rc-legend');
		var output = document.getElementById('diag-rc-output');
		if (legend && output) {
		/*stxhr.onerror = function() {
				const myTimeout = setTimeout(get_phytest, 5000, interface);
		}*/
		stxhr.post('<%=url('admin/network')%>/diag_' + tool + '/' + param, { token: '<%=token%>' },
				function(x)
				{
						if (x.responseText)
						{
							legend.style.display = 'none';
							output.innerHTML = String.format('<pre>%h</pre>', x.responseText);
						}
						else
						{
							legend.style.display = 'none';
							output.innerHTML = '<span class="error"><%:Failed to run cable diagnostics!%></span>';
						}
				}
			);
		}
	}
	function run_phytest(interface)
	{
        if(confirm('Ethernet ports link will be down and lose connection while running Cable Diagnostics.\nAre you sure you want to continue?\nNote: Diagnostics is only accurate for cables of length 7 - 120 meters.'))
		{
			var tool = "phytest";
			var param = interface;
			var legend = document.getElementById('diag-rc-legend');
			var output = document.getElementById('diag-rc-output');
			if (legend && output)
			{
				output.innerHTML =
						'<img src="<%=resource%>/icons/loading.gif" alt="<%:Loading%>" style="vertical-align:middle" /> ' +
						'<%:Waiting for command to complete...%>'
				;
				legend.parentNode.style.display = 'block';
				legend.style.display = 'inline';
				stxhr.post('<%=url('admin/network')%>/diag_' + tool + '/' + param, { token: '<%=token%>' },
						function(x)
						{
							if (x.responseText)
							{
									legend.style.display = 'none';
									output.innerHTML = String.format('<pre>%h</pre>', x.responseText);
							}
							/*else This is expected!
							{
									legend.style.display = 'none';
									output.innerHTML = '<span class="error"><%:Failed to run cable diagnostics!%></span>';
							}*/
						}
				);
			}
			const myTimeout = setTimeout(get_phytest, 15000, interface);
        }
    }
	function update_status(field, proto)
	{
		var tool = field.name;
		var addr = field.value;
		var protocol = proto ? "6" : "";

		var legend = document.getElementById('diag-rc-legend');
		var output = document.getElementById('diag-rc-output');

		if (legend && output)
		{
			output.innerHTML =
				'<img src="<%=resource%>/icons/loading.gif" alt="<%:Loading%>" style="vertical-align:middle" /> ' +
				'<%:Waiting for command to complete...%>'
			;

			legend.parentNode.style.display = 'block';
			legend.style.display = 'inline';

			stxhr.post('<%=url('admin/network')%>/diag_' + tool + protocol + '/' + addr, { token: '<%=token%>' },
				function(x)
				{
					if (x.responseText)
					{
						legend.style.display = 'none';
						output.innerHTML = String.format('<pre>%h</pre>', x.responseText);
					}
					else
					{
						legend.style.display = 'none';
						output.innerHTML = '<span class="error"><%:Bad address specified!%></span>';
					}
				}
			);
		}
	}
//]]></script>

<form method="post" action="<%=url('admin/network/diagnostics')%>">
	<div class="cbi-map">
		<h2 name="content"><%:Diagnostics%></h2>
		<div class="cbi-section" style="display:none">
                <strong id="diag-rc-legend"></strong>
                <span id="diag-rc-output"></span>
        </div>
		<div class="cbi-section">
			<legend><%:Network Utilities%></legend>

			<div class="table">
				<div class="tr">
					<div class="td left">
						<input style="margin: 5px 0" type="text" value="<%=ping_host%>" name="ping" /><br />
						<% if has_ping6 then %>
						<span>
							<select name="ping_proto" style="width:auto">
								<option value="" selected="selected"><%:IPv4%></option>
								<option value="6"><%:IPv6%></option>
							</select>
						</span>
						<input type="button" value="<%:Ping%>" class="cbi-button cbi-button-apply" onclick="update_status(this.form.ping, this.form.ping_proto.selectedIndex)" />
						<% else %>
						<input type="button" value="<%:Ping%>" class="cbi-button cbi-button-apply" onclick="update_status(this.form.ping)" />
						<% end %>
					</div>

					<div class="td left">
						<input style="margin: 5px 0" type="text" value="<%=route_host%>" name="traceroute" /><br />
						<% if has_traceroute6 then %>
						<span>
							<select name="traceroute_proto" style="width:auto">
								<option value="" selected="selected"><%:IPv4%></option>
								<option value="6"><%:IPv6%></option>
							</select>
						</span>
						<input type="button" value="<%:Traceroute%>" class="cbi-button cbi-button-apply" onclick="update_status(this.form.traceroute, this.form.traceroute_proto.selectedIndex)" />
						<% else %>
						<input type="button" value="<%:Traceroute%>" class="cbi-button cbi-button-apply" onclick="update_status(this.form.traceroute)" />
						<% end %>
						<% if not has_traceroute6 then %>
							<p>&#160;</p>
							<p><%:Install iputils-traceroute6 for IPv6 traceroute%></p>
						<% end %>
					</div>

					<div class="td left">
						<input style="margin: 5px 0" type="text" value="<%=dns_host%>" name="nslookup" /><br />
						<input type="button" value="<%:Nslookup%>" class="cbi-button cbi-button-apply" onclick="update_status(this.form.nslookup)" />
					</div>
				</div>
			</div>
		</div>
		<div class="cbi-section">
            <legend><%:Cable Diagnostics%></legend>
            <div class="table">
               	<div class="tr">
                    <table class='table-responsive'>
                    <% if has_eth0 then %>
                    <tr>
	                    <td>
		                    <span>Port 1</span>
	                    </td>
	                    <td>
		                    <input type="button" value="<%:Start%>" class="cbi-button cbi-button-apply" onclick="run_phytest('eth0')" />
	                    </td>
                    </tr>	
                    <% end %>
                    <% if has_eth1 then %>
                    <tr>
	                    <td>
		                    <span>Port 2</span>
	                    </td>
	                    <td>
		                    <input type="button" value="<%:Start%>" class="cbi-button cbi-button-apply" onclick="run_phytest('eth1')" />
	                    </td>
                    </tr>
                    <% end %>
                    </table>
                </div>
            </div>
        </div>
	</div>
</form>

<%+footer%>
