<div id="main">
    <div class="header">
      <h1>Wifi Configuration</h1>
    </div>

    <div class="content pure-g">
      <div class="pure-u-12-24"><div class="card">
        <h1>Wifi State</h2>
        <div id="wifi-spinner" class="spinner spinner-small"></div>
        <table id="wifi-table" class="pure-table pure-table-horizontal" hidden><tbody>
        <tr><td>WiFi mode</td><td id="wifi-mode"></td></tr>
        <tr><td>Configured network</td><td id="wifi-ssid"></td></tr>
        <tr><td>Wifi status</td><td id="wifi-status"></td></tr>
        <tr><td>Wifi address</td><td id="wifi-ip"></td></tr>
        <tr><td>Wifi rssi</td><td id="wifi-rssi"></td></tr>
        <tr><td>Wifi phy</td><td id="wifi-phy"></td></tr>
        <tr><td>Wifi MAC</td><td id="wifi-mac"></td></tr>
        <tr><td colspan="2" id="wifi-warn"></td></tr>
        </tbody> </table>
      </div></div>
      <div class="pure-u-12-24"><div class="card">
        <h1>Wifi Association</h2>
        <p id="reconnect" style="color: #600" hidden></p>
        <form action="#" id="wifiform" class="pure-form pure-form-stacked">
        <!--form name="wifiform" action="connect.cgi" method="post"-->
          <legend>To connect to a WiFi network, please select one of the detected networks,
             enter the password, and hit the connect button...</legend>
          <label>Network SSID</label>
          <div id="aps">Scanning... <div class="spinner spinner-small"></div></div>
          <label>WiFi password, if applicable:</label>
          <input id="wifi-passwd" type="text" name="passwd" placeholder="password">
          <button id="connect-button" type="submit" class="pure-button button-primary">Connect!</button>
        </form>
      </div></div>
    </div>
  </div>
</div>

<script src="/ui.js"></script>
<script type="text/javascript">

var currAp = "";
var blockScan = 0;

function createInputForAp(ap) {
  if (ap.essid=="" && ap.rssi==0) return;

  var input = document.createElement("input");
  input.type = "radio";
  input.name = "essid";
  input.value=ap.essid;
  input.id   = "opt-" + ap.essid;
  if (currAp == ap.essid) input.checked = "1";

  var bars    = document.createElement("div");
  var rssiVal = -Math.floor(ap.rssi/51)*32;
  bars.className = "lock-icon";
  bars.style.backgroundPosition = "0px "+rssiVal+"px";

  var rssi = document.createElement("div");
  rssi.innerHTML = "" + ap.rssi +"dB";

  var encrypt = document.createElement("div");
  var encVal  = "-64"; //assume wpa/wpa2
  if (ap.enc == "0") encVal = "0"; //open
  if (ap.enc == "1") encVal = "-32"; //wep
  encrypt.className = "lock-icon";
  encrypt.style.backgroundPosition = "-32px "+encVal+"px";

  var label = document.createElement("div");
  label.innerHTML = ap.essid;

  var div = document.createElement("label");
  div.for = "opt-" + ap.essid;
  div.appendChild(input);
  div.appendChild(encrypt);
  div.appendChild(bars);
  div.appendChild(rssi);
  div.appendChild(label);
  return div;
}

function getSelectedEssid() {
  var e = document.forms.wifiform.elements;
  for (var i=0; i<e.length; i++) {
    if (e[i].type == "radio" && e[i].checked) return e[i].value;
  }
  return currAp;
}

var scanTimeout = null;
var scanReqCnt = 0;

function scanResult() {
  if (scanReqCnt > 60) {
    return scanAPs();
  }
  scanReqCnt += 1;
  ajaxJson('GET', "scan", function(data) {
      currAp = getSelectedEssid();
      if (data.result.inProgress == "0" && data.result.APs.length > 1) {
        $("#aps").innerHTML = "";
        var n = 0;
        for (var i=0; i<data.result.APs.length; i++) {
          if (data.result.APs[i].essid == "" && data.result.APs[i].rssi == 0) continue;
          $("#aps").appendChild(createInputForAp(data.result.APs[i]));
          n = n+1;
        }
        showNotification("Scan found " + n + " networks");
        var cb = $("#connect-button");
        cb.className = cb.className.replace(" pure-button-disabled", "");
        if (scanTimeout != null) clearTimeout(scanTimeout);
        scanTimeout = window.setTimeout(scanAPs, 20000);
      } else {
        window.setTimeout(scanResult, 1000);
      }
    }, function(s, st) {
      window.setTimeout(scanResult, 5000);
  });
}

function scanAPs() {
  if (blockScan) {
    scanTimeout = window.setTimeout(scanAPs, 1000);
    return;
  }
  scanTimeout = null;
  scanReqCnt = 0;
  ajaxReq('POST', "scan", function(data) {
    //showNotification("Wifi scan started");
    window.setTimeout(scanResult, 1000);
  }, function(s, st) {
    //showNotification("Wifi scan may have started?");
    window.setTimeout(scanResult, 1000);
  });
}

function getStatus() {
  ajaxJsonSpin("GET", "connstatus", function(data) {
      if (data.status == "idle" || data.status == "connecting") {
        $("#aps").innerHTML = "Connecting...";
        showNotification("Connecting...");
        window.setTimeout(getStatus, 1000);
      } else if (data.status == "got IP address") {
        var txt = "Connected! Got IP "+data.ip;
        showNotification(txt);
        showWifiInfo(data);
        blockScan = 0;

        var txt2 = "esp-link will switch to STA-only mode in a few seconds";
        window.setTimeout(function() { showNotification(txt2); }, 4000);

        $("#reconnect").removeAttribute("hidden");
        $("#reconnect").innerHTML =
          "If you are in the same network, go to <a href=\"http://"+data.ip+
          "/\">"+data.ip+"</a>, else connect to network "+data.ssid+" first.";
      } else {
        blockScan = 0;
        showWarning("Connection failed: " + data.status + ", " + data.reason);
        $("#aps").innerHTML = 
          "Check password and selected AP. <a href=\"wifi.tpl\">Go Back</a>";
      }
    }, function(s, st) {
      //showWarning("Can't get status: " + st);
      window.setTimeout(getStatus, 2000);
    });
}

function changeWifiMode(m) {
  blockScan = 1;
  hideWarning();
  ajaxSpin("POST", "setmode?mode=" + m, function(resp) {
    showNotification("Mode changed");
    window.setTimeout(getWifiInfo, 100);
    blockScan = 0;
  }, function(s, st) {
    showWarning("Error changing mode: " + st);
    window.setTimeout(getWifiInfo, 100);
    blockScan = 0;
  });
}

function changeWifiAp(e) {
  e.preventDefault();
  var passwd = $("#wifi-passwd").value;
  var essid = getSelectedEssid();
  console.log("Posting form", "essid=" + essid, "pwd="+passwd);
  showNotification("Connecting to " + essid);
  var url = "connect?essid="+encodeURIComponent(essid)+"&passwd="+encodeURIComponent(passwd);

  hideWarning();
  $("#reconnect").setAttribute("hidden", "");
  $("#wifi-passwd").value = "";
  var cb = $("#connect-button");
  var cn = cb.className;
  cb.className += ' pure-button-disabled';
  blockScan = 1;
  ajaxSpin("POST", url, function(resp) {
      $("#spinner").removeAttribute('hidden'); // hack
      showNotification("Waiting for network change...");
      window.scrollTo(0, 0);
      window.setTimeout(getStatus, 2000);
    }, function(s, st) {
      showWarning("Error switching network: "+st);
      cb.className = cn;
      window.setTimeout(scanAPs, 1000);
    });
}

window.onload=function(e) {
  getWifiInfo();
  $("#wifiform").onsubmit = changeWifiAp;
  scanTimeout = window.setTimeout(scanAPs, 500);
};
</script>
</body></html>