<!--
Copyright 2013, Google Inc.
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:

    * Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
    * Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
    * Neither the name of Google Inc. nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-->

<!--
Simple example of the Server-Sent Events
http://dev.w3.org/html5/eventsource/

For comparison with the WebSocket Protocol & API.

Run the pywebsocket with the --cgi_path parameter.
-->

<html>
<head>
<title>Server-Sent Events Example</title>
<script>
var eventSource = null;

function addToLog(data) {
  logBox.value += data + '\n';
  logBox.scrollTop = 1000000;
}

function init() {
  logBox = document.getElementById('log');

  eventSource  = new EventSource('/eventsource.cgi');
  eventSource.onopen = function() {
    addToLog('onopen (readyState = ' + eventSource.readyState + ')');
  }
  eventSource.onmessage = function(event) {
    addToLog(event.data);
  }
  eventSource.onerror = function(event) {
    addToLog('onerror (readyState = ' + eventSource.readyState + ')');
  }
}
</script>
</head>
<body onload="init()">
<textarea id="log" rows="10" cols="40" readonly></textarea>
<p style="font-size: small">
  Make sure that pywebsocket is run with --cgi_path parameter.
</p>
</body>
</html>
