CraftUI = function() {
  // Do some feature sniffing for dependencies and return if not supported.
  if (!window.XMLHttpRequest ||
      !document.querySelector ||
      !Element.prototype.addEventListener ||
      !('classList' in document.createElement('_'))) {
    document.documentElement.classList.add('unsupported');
    return;
  }

  // Initialize the info.
  CraftUI.getInfo();

  // Refresh data periodically.
  window.setInterval(CraftUI.getInfo, 5000);
};

CraftUI.info = {checksum: 0};
CraftUI.am_sending = false

CraftUI.updateField = function(key, val) {
  var el = document.getElementById(key);
  if (el == null) {
    self.unhandled += key + '=' + val + '; ';
    return;
  }
  el.innerHTML = ''; // Clear the field.
  // For objects, create an unordered list and append the values as list items.
  if (val && typeof val === 'object') {
    var ul = document.createElement('ul');
    for (key in val) {
      var li = document.createElement('li');
      var primary = document.createTextNode(key + ' ');
      li.appendChild(primary);
      var secondary = document.createElement('span');
      secondary.textContent = val[key];
      li.appendChild(secondary);
      ul.appendChild(li);
    }
    // If the unordered list has children, append it and return.
    if (ul.hasChildNodes()) {
      el.appendChild(ul);
      return;
    } else {
      val = 'N/A';
    }
  }
  el.appendChild(document.createTextNode(val));
};

CraftUI.flattenAndUpdateFields = function(jsonmap, prefix) {
  for (var key in jsonmap) {
    var val = jsonmap[key];
    if (typeof val !== 'object') {
      CraftUI.updateField(prefix + key, jsonmap[key]);
    } else {
      CraftUI.flattenAndUpdateFields(val, prefix + key + '/')
    }
  }
};

CraftUI.getInfo = function() {
  // Request info, set the connected status, and update the fields.
  if (CraftUI.am_sending) {
    return;
  }
  var xhr = new XMLHttpRequest();
  xhr.onreadystatechange = function() {
    self.unhandled = '';
    if (xhr.readyState == 4 && xhr.status == 200) {
      var list = JSON.parse(xhr.responseText);
      CraftUI.flattenAndUpdateFields(list, '');
    }
    CraftUI.updateField('unhandled', self.unhandled);
    CraftUI.am_sending = false
  };
  var payload = [];
  payload.push('checksum=' + encodeURIComponent(CraftUI.info.checksum));
  payload.push('_=' + encodeURIComponent((new Date()).getTime()));
  xhr.open('get', 'content.json?' + payload.join('&'), true);
  CraftUI.am_sending = true
  xhr.send();
};

CraftUI.config = function(key, activate, is_password) {
  // POST as json
  var el = document.getElementById(key);
  var xhr = new XMLHttpRequest();
  var action = "Configured";
  xhr.open('post', 'content.json');
  xhr.setRequestHeader('Content-Type', 'application/json; charset=UTF-8');
  var data;
  if (is_password) {
    var value_admin = btoa(document.getElementById(key + "_admin").value);
    var value_new = btoa(document.getElementById(key + "_new").value);
    var value_confirm = btoa(document.getElementById(key + "_confirm").value);
    data = { config: [ { [key]: {
          "admin": value_admin,
          "new": value_new,
          "confirm": value_confirm,
        } } ] };
  } else if (activate) {
    data = { config: [ { [key + "_activate"]: "true" } ] };
    action = "Applied";
  } else {
    data = { config: [ { [key]: el.value } ] };
  }
  var txt = JSON.stringify(data);
  var resultid = key + "_result"
  var el = document.getElementById(resultid);
  xhr.onload = function(e) {
    var json = JSON.parse(xhr.responseText);
    if (json.error == 0) {
      el.innerHTML = action + " successfully.";
    } else {
      el.innerHTML = "Error: " + json.errorstring;
    }
    CraftUI.getInfo();
  }
  xhr.onerror = function(e) {
    el.innerHTML = xhr.statusText + xhr.responseText;
  }
  el.innerHTML = "sending...";
  xhr.send(txt);
};

new CraftUI();
