/* -*- Mode: js2; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* vim: set et sw=2 ts=2: */ 'use strict'; function get_appropriate_ws_url() { // From: https://gist.github.com/2428561 var parser = document.createElement('a'); parser.href = document.URL; // We open the websocket encrypted if this page came on an // https:// url itself, otherwise unencrypted if(parser.protocol == "http:") { parser.protocol = "ws:"; } if(parser.protocol == "https:") { parser.protocol = "wss:"; } return parser.href; } var socket_node = new WebSocket(get_appropriate_ws_url(), "lws-node-protocol"); try { socket_node.onopen = function() { var connectEvent = new CustomEvent("connectEvent", { detail: { time: new Date(), }, bubbles: true, cancelable: true }); document.dispatchEvent(connectEvent); }; socket_node.onmessage = function got_packet(packet) { var messageEvent = new CustomEvent("messageEvent", { detail: { message: "recv [" + packet.data + "]", time: new Date(), }, bubbles: true, cancelable: true }); document.dispatchEvent(messageEvent); var msgs = new Array(); var idx = 0; msgs[idx] = ''; var c = 0; var instring = false; for(c = 0; c < packet.data.length; c++) { if(packet.data[c] == '"' && c > 0 && packet.data[c - 1] != '\\') { instring = !instring; } if(packet.data[c] == ';' && instring == false) { idx++; msgs[idx] = ''; } if(packet.data[c] != ';' || instring == true) { msgs[idx] += packet.data[c]; } } var f = 0; while (f < msgs.length - 1) { var msg = new Array(); instring = false; idx = 0; // Strip padding and trailing whitespace. var msgstr = msgs[f].replace(/^\s+||\s+$/g,''); if(msgstr == ';') { f++; continue; } msg[idx] = ''; for(c = 0; c < msgstr.length; c++) { if(msgstr[c] == '"' && c > 0 && msgstr[c - 1] != '\\') { instring = !instring; continue; } if(msgstr[c] == ' ' && instring == false) { msg[idx] = msg[idx].replace("\\\\","\\").replace("\\\"","\""); idx++; msg[idx] = ''; } if(msgstr[c] != ' ' || instring == true) msg[idx] += msgstr[c]; } if(msg[0] == "error") { alert("Error(#" + unescape(msg[1]) + "): " + unescape(msg[2])); f++; continue; } var subscribeid = msg[0]; var cmd = msg[1]; var id = msg[2]; if(cmd == "remove") { var removeEvent = new CustomEvent("removeEvent", { detail: { subscribeid: subscribeid, id: id, }, bubbles: true, cancelable: true }); document.dispatchEvent(removeEvent); } else if(cmd == "move") { var moveEvent = new CustomEvent("moveEvent", { detail: { subscribeid: subscribeid, id: id, parentid: msg[3], insertBeforeId: msg[4], }, bubbles: true, cancelable: true }); document.dispatchEvent(moveEvent); } else if(cmd == "create") { var createEvent = new CustomEvent("createEvent", { detail: { subscribeid: subscribeid, id: id, parentid: msg[3], insertBeforeId: msg[4], }, bubbles: true, cancelable: true }); document.dispatchEvent(createEvent); } else if(cmd == "update") { var updateEvent = new CustomEvent("updateEvent", { detail: { subscribeid: subscribeid, id: id, name: unescape(msg[3]), value: unescape(msg[4]), }, bubbles: true, cancelable: true }); document.dispatchEvent(updateEvent); } f++; } }; socket_node.onclose = function(){ var disconnectEvent = new CustomEvent("disconnectEvent", { detail: { time: new Date(), }, bubbles: true, cancelable: true }); document.dispatchEvent(disconnectEvent); }; } catch(exception) { alert('

Error' + exception + '

'); } function transmit(msg) { //LogEvent(msg); var messageEvent = new CustomEvent("messageEvent", { detail: { message: "send [" + msg + "]", time: new Date(), }, bubbles: true, cancelable: true }); document.dispatchEvent(messageEvent); socket_node.send(msg); } function login(user, password) { transmit("login "+user+" "+password); } function logout() { transmit("logout"); } function subscribe(id) { transmit("subscribe "+id); } function unsubscribe(id) { transmit("unsubscribe "+id); } function create(id, parent, before) { transmit("create "+id+" "+parent+" "+before); } function remove(id) { transmit("remove "+id); } function update(id, name, value) { transmit("update "+id+" "+escape(name)+" "+escape(value)); } function move(id, parent, before) { transmit("move "+id+" "+parent+" "+before); }