<!--

    Licensed to the Apache Software Foundation (ASF) under one or more
    contributor license agreements.  See the NOTICE file distributed with
    this work for additional information regarding copyright ownership.
    The ASF licenses this file to You under the Apache License, Version 2.0
    (the "License"); you may not use this file except in compliance with
    the License.  You may obtain a copy of the License at

         http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing, software
    distributed under the License is distributed on an "AS IS" BASIS,
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    See the License for the specific language governing permissions and
    limitations under the License.

-->
<html>

<head>
  <title>Camel Twitter WebSocket Blueprint Example</title>
  <script type='text/javascript'>

    if (!window.WebSocket) {
      alert("WebSocket not supported by this browser");
    }

    var room = {
      join: function (name) {
        this._username = name;
        var location = "ws://localhost:9090/camel-tweet";
        this._ws = new WebSocket(location);
        this._ws.onmessage = this._onmessage;
        this._ws.onclose = this._onclose;
      },

      _onmessage: function (m) {
        if (m.data) {
          var chat = document.getElementById('chat')
          var spanText = document.createElement('span');
          spanText.className = 'text';
          spanText.innerHTML = m.data;
          var lineBreak = document.createElement('br');
          chat.appendChild(spanText);
          chat.appendChild(lineBreak);
          chat.scrollTop = chat.scrollHeight - chat.clientHeight;
        }
      },

      _onclose: function (m) {
        this._ws = null;
      }

    };

  </script>
  <style type='text/css'>
    div {
      border: 0px solid black;
    }

    div#chat {
      clear: both;
      width: 80em;
      height: 60ex;
      overflow: auto;
      background-color: #f0f0f0;
      padding: 4px;
      border: 1px solid black;
    }
  </style>
</head>

<body>
<div id='chat'></div>
<script type='text/javascript'>
  room.join("Testing");
</script>
</body>

</html>
