Revision control

++ <!DOCTYPE html>
++ <html>
++ <head>
++ <title>ChatClient</title>
++
++ <meta name="viewport" content="width=device-width, initial-scale=1" />
++
++ <link rel="stylesheet" type="text/css" href="http://www.jeasyui.com/easyui/themes/default/easyui.css" />
++ <link rel="stylesheet" type="text/css" href="http://www.jeasyui.com/easyui/themes/icon.css" />
++ <link rel="stylesheet" type="text/css" href="http://www.jeasyui.com/easyui/demo/demo.css" />
++ <script src="http://code.jquery.com/jquery-1.9.1.js"></script>
++ <script type="text/javascript" src="http://www.jeasyui.com/easyui/jquery.easyui.min.js"></script>
++ <script type="text/javascript" src="qwebchannel.js"></script>
++
++ <script>
++ 'use strict';
++ var wsUri = "ws://localhost:12345";
++ window.loggedin = false;
++
++ window.onload = function() {
++ var socket = new WebSocket(wsUri);
++
++ socket.onclose = function() {
++ console.error("web channel closed");
++ };
++ socket.onerror = function(error) {
++ console.error("web channel error: " + error);
++ };
++ socket.onopen = function() {
++ window.channel = new QWebChannel(socket, function(channel) {
++ //connect to the changed signal of a property
++ channel.objects.chatserver.userListChanged.connect(function() {
++ $('#userlist').empty();
++ //access the property
++ channel.objects.chatserver.userList.forEach(function(user) {
++ $('#userlist').append(user + '<br>');
++ });
++ });
++ //connect to a signal
++ channel.objects.chatserver.newMessage.connect(function(time, user, message) {
++ $('#chat').append("[" + time + "] " + user + ": " + message + '<br>');
++ });
++ //connect to a signal
++ channel.objects.chatserver.keepAlive.connect(function(args) {
++ if (window.loggedin) {
++ //call a method
++ channel.objects.chatserver.keepAliveResponse($('#loginname').val())
++ console.log("sent alive");
++ }
++ });
++
++ });
++ }
++ }
++ </script>
++ </head>
++ <body>
++
++ <div id="loginDialog" class="easyui-dialog" title="Chat Login" data-options="iconCls:'icon-save'" style="width:400px;height:200px;padding:10px">
++ <form id="loginForm" method="post">
++ <table cellpadding="5">
++ <tr><td>Name:</td><td><input class="easyui-validatebox" type="text" id="loginname" name="name" data-options="required:true"></input></td></tr>
++ </table>
++ </form>
++ <div style="text-align:center;padding:5px">
++ <a href="javascript:void(0)" class="easyui-linkbutton" onclick="submitForm()">Login</a>
++ </div>
++ <div style="text-align:center;padding:5px" id="loginError">
++ Username already in use.
++ </div>
++ <script>
++ $('#loginForm').submit(submitForm);
++
++ function submitForm(event) {
++ console.log("DEBUG login: " + channel);
++ channel.objects.chatserver.login($('#loginname').val(), function(arg) {
++ console.log("DEBUG login response: " + arg);
++ if (arg === true) {
++ $('#loginError').hide();
++ $('#loginDialog').dialog('close');
++ window.loggedin = true;
++ } else {
++ $('#loginError').show();
++ }
++ });
++ console.log($('#loginname').val());
++ if (event !== undefined)
++ event.preventDefault();
++ return false;
++ }
++ </script>
++ </div>
++
++
++ <div class="easyui-layout" style="width:500px;height:300px;">
++ <div data-options="region:'east',split:true" title="Users" id="userlist" style="width:100px;">
++
++ </div>
++ <div data-options="region:'south',split:true" style="height:50px;">
++ <form id="messageForm">
++ <input class="easyui-validatebox" type="text" id="message" name="name" style="width: 97%"></input>
++ </form>
++ </div>
++ <div data-options="region:'center'" id="chat">
++
++ </div>
++ <script>
++ $('#messageForm').submit(submitMessage);
++
++ function submitMessage(event) {
++ channel.objects.chatserver.sendMessage($('#loginname').val(), $('#message').val());
++ $('#message').val('');
++ if (event !== undefined)
++ event.preventDefault();
++ return false;
++ }
++ </script>
++ </div>
++
++
++ <script type="text/javascript">
++ $(document).ready(function() {
++ $('#loginError').hide();
++ });
++ </script>
++
++ </body>
++ </html>