script.js 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. (function(){
  2. function httpApi(url, method, callback) {
  3. var req = new XMLHttpRequest();
  4. req.onreadystatechange = function(e) {
  5. if (this.readyState === XMLHttpRequest.DONE)
  6. callback(this.status, JSON.parse(this.responseText));
  7. };
  8. req.open(method, url, true);
  9. req.send();
  10. }
  11. function setInputState(output, input, state) {
  12. httpApi("/api/setState?output=" +encodeURIComponent(output) +"&input=" +encodeURIComponent(input) +"&state=" +(state ? 1 : 0), "POST", (status, outputs) => {
  13. if (status !== 200)
  14. console.error("Cannot set output list");
  15. else
  16. displayOutputs(outputs);
  17. });
  18. }
  19. function makeOutputStatus(data) {
  20. var statusDiv = document.createElement("div");
  21. statusDiv.className = "status";
  22. if (data.status) {
  23. if (data.status.status.plugged) {
  24. var pluggedIcon = document.createElement("img");
  25. pluggedIcon.className = "icon"
  26. pluggedIcon.src = "charging.svg";
  27. statusDiv.appendChild(pluggedIcon);
  28. }
  29. if (data.status.status.battery !== undefined) {
  30. var batteryLvl = document.createElement("span"),
  31. batteryIcon = document.createElement("img"),
  32. batteryRes = [ "lowbattery.svg", "quarterbattery.svg", "batteryalmostcharged.svg", "batteryfullycharged.svg" ];
  33. batteryIcon.src = batteryRes[Math.min(batteryRes.length -1, Math.floor((data.status.status.battery * batteryRes.length) / 100))];
  34. batteryIcon.className = "icon";
  35. batteryLvl.appendChild(batteryIcon);
  36. batteryLvl.innerHTML += data.status.status.battery +"%";
  37. statusDiv.appendChild(batteryLvl);
  38. }
  39. if (data.status.ping) {
  40. var ping = document.createElement("div"),
  41. icon = document.createElement("img");
  42. icon.className = "icon";
  43. icon.src = "wifi.svg";
  44. ping.appendChild(icon);
  45. ping.innerHTML += data.status.ping.duration +"ms";
  46. statusDiv.appendChild(ping);
  47. }
  48. if (data.volumeControl) {
  49. var volumeControl = document.createElement("div"),
  50. label = document.createElement("label"),
  51. labelIcon = document.createElement("img"),
  52. labelText = document.createElement("span"),
  53. input = document.createElement("input"),
  54. submit = document.createElement("button");
  55. labelIcon.className = "icon";
  56. labelIcon.src = "volume.svg";
  57. labelText.textContent = "Volume: ";
  58. input.className = "input-percent"
  59. input.type = "number";
  60. input.min = 0;
  61. input.max = 100;
  62. input.value = data.status.status.volume;
  63. submit.textContent = "Set volume";
  64. submit.outputId = data.id;
  65. submit.volumeInput = input;
  66. submit.onclick = function() {
  67. var value = Math.min(100, Math.max(0, this.volumeInput.value));
  68. httpApi("/api/setVol?output=" +this.outputId +"&volume=" +value, "POST", () => {
  69. setTimeout(refreshOutput, 1000);
  70. });
  71. };
  72. label.appendChild(labelIcon);
  73. label.appendChild(labelText);
  74. label.appendChild(input);
  75. volumeControl.appendChild(label);
  76. volumeControl.appendChild(submit);
  77. statusDiv.appendChild(volumeControl);
  78. }
  79. } else {
  80. statusDiv.classList.add("no-status");
  81. }
  82. return statusDiv;
  83. }
  84. function makeOutputNode(data) {
  85. var child = document.createElement("fieldset"),
  86. inputList = document.createElement("ul");
  87. child.classList.add("output");
  88. child.innerHTML += "<legend>" +data.name +"</legend>";
  89. child.appendChild(makeOutputStatus(data));
  90. for (var i in data.inputs) {
  91. var inputItem = document.createElement("li");
  92. inputItem.classList.add("input");
  93. inputItem.classList.add(data.inputs[i] ? "input-enabled" : "input-disabled");
  94. inputItem.textContent = i;
  95. (function() {
  96. var output = data.id,
  97. input = i,
  98. state = data.inputs[i];
  99. inputItem.addEventListener("click", () => setInputState(output, input, !state));
  100. })();
  101. inputList.appendChild(inputItem);
  102. }
  103. child.appendChild(inputList);
  104. return child;
  105. }
  106. function displayOutputs(outputs) {
  107. var div = document.getElementById("outputs");
  108. div.innerHTML = "";
  109. outputs.forEach(i => div.appendChild(makeOutputNode(i)));
  110. }
  111. function refreshOutput() {
  112. httpApi("/api/outputs", "GET", (status, outputs) => {
  113. if (status !== 200)
  114. console.error("Cannot fetch output list");
  115. else
  116. displayOutputs(outputs);
  117. });
  118. }
  119. refreshOutput();
  120. })()