add connected/disconnected text
[mudsync.git] / data / web-static / js / mudsync.js
index 90f3daa4ef9af9d995cf1c0649a6c19ab1ff0c71..c5b7dca82d47cd928e351035814fda29b01327e1 100644 (file)
 ;;; along with Mudsync.  If not, see <http://www.gnu.org/licenses/>.
 */
 
-function displayMessage(data, self_sent) {
-    var new_entry = document.createElement("div");
-    var new_text = document.createTextNode(data);
+function scrollDown() {
+    var stream_metabox = document.getElementById("stream-metabox");o
+    stream_metabox.scrollTop = stream_metabox.scrollHeight;
+}
+
+function withMaybeScroll(thunk) {
     var stream_metabox = document.getElementById("stream-metabox");
     var should_scroll = false;
-    if(stream_metabox.scrollTop === (stream_metabox.scrollHeight
-                                     - stream_metabox.offsetHeight)) {
+    // if within a reasonable threshold, we scroll
+    if((stream_metabox.scrollHeight - stream_metabox.offsetHeight)
+       - stream_metabox.scrollTop <= 50) {
         should_scroll = true;
     }
-    document.getElementById("main-input").value = "";
-    if (self_sent) {
-        new_entry.setAttribute("class", "stream-entry self-sent");
-    } else {
-        new_entry.setAttribute("class", "stream-entry");
-    }
-    new_entry.appendChild(new_text);
-    document.getElementById("stream").appendChild(new_entry);
+    thunk();
     if (should_scroll) {
         stream_metabox.scrollTop = stream_metabox.scrollHeight;
     }
 }
 
+
+function displayMessage(data, self_sent) {
+    var new_entry = document.createElement("div");
+    withMaybeScroll(
+        function () {
+            if (self_sent) {
+                new_entry.setAttribute("class", "stream-entry self-sent");
+                document.getElementById("main-input").value = "";
+            } else {
+                new_entry.setAttribute("class", "stream-entry");
+            }
+            new_entry.innerHTML = data;
+            document.getElementById("stream").appendChild(new_entry);
+        });
+}
+
+function setConnectedText(string, to_class) {
+    var stream_metabox = document.getElementById("connection-status");
+    stream_metabox.textContent = "[" + string + "]";
+    stream_metabox.setAttribute("class", to_class);
+}
+
 function installWebsocket() {
     // TODO: Don't hardcode the websocket path; pull it from the DOM
-    var ws = new WebSocket("ws://127.0.0.1:8888");
+    var address = "ws://".concat(window.location.hostname, ":", window.location.port);
+    var ws = new WebSocket(address);
     ws.onmessage = function(evt) {
         displayMessage(evt.data, false);
     };
     ws.onopen = function() {
+        setConnectedText("connected", "connected");
         console.log("connected");
     };
     ws.onclose = function () {
+        setConnectedText("disconnected", "disconnected");
+        // kludge, we shouldn't be using self_sent like this because it
+        // wipes the input
+        displayMessage(
+            "* You have been disconnected.  Refresh to (hopefully) reconnect.",
+            true);
         console.log("closed websocket");
     };
     installUIHooks(ws);
@@ -62,7 +89,10 @@ function installUIHooks(ws) {
         var keyCode = e.keyCode || e.which;
         if (keyCode == '13') {
             var input_val = input.value;
-            displayMessage("> ".concat(input_val), true);
+            withMaybeScroll(
+                function () {
+                    displayMessage("> ".concat(input_val), true);
+                });
             sendMessageToServer(ws, input_val);
         }
     }
@@ -72,7 +102,7 @@ function sendMessageToServer(ws, data) {
     ws.send(data);
 }
 
-
 window.onload = function () {
     installWebsocket();
+    window.onresize = scrollDown;
 }