blob: f1d1af3eb880b92ecba2f4646857642ff3f72122 [file] [log] [blame]
<!DOCTYPE html>
<html>
<head>
<meta charset='UTF-8'>
<title>Websocket Meters</title>
<!--
Version 0.1 Contributed by William Greathouse 9-Sep-2013
Simple demo of WebSocket connection use. Not a great example of web coding,
but it is functional.
The meter displays are adapted from CSS-TRICKS Progress Bars by Chris Coyier
at http://css-tricks.com/css3-progress-bars/
-->
<style>
body {
background: #222;
}
h1 {
color: white;
text-align: center;
}
button {
width: 225px;
height: 30px;
margin: auto 10px;
background-color: #ccc;
-moz-border-radius: 5px;
-webkit-border-radius: 5px;
border-radius:6px;
color: blue;
font-size: 20px;
}
button:hover {
background-color: #888;
}
button:hover:disabled {
background-color: #ccc;
}
button:disabled {
color: lightgray;
}
.button_container {
width:550px;
display:block;
margin-left:auto;
margin-right:auto;
}
.meter {
height: 20px; /* Can be anything */
position: relative;
background: #555;
-moz-border-radius: 25px;
-webkit-border-radius: 25px;
border-radius: 25px;
padding: 10px;
-webkit-box-shadow: inset 0 -1px 1px rgba(255,255,255,0.3);
-moz-box-shadow : inset 0 -1px 1px rgba(255,255,255,0.3);
box-shadow : inset 0 -1px 1px rgba(255,255,255,0.3);
}
.meter > span {
display: block;
height: 100%;
-webkit-border-top-right-radius: 20px;
-webkit-border-bottom-right-radius: 20px;
-moz-border-radius-topright: 20px;
-moz-border-radius-bottomright: 20px;
border-top-right-radius: 20px;
border-bottom-right-radius: 20px;
-webkit-border-top-left-radius: 20px;
-webkit-border-bottom-left-radius: 20px;
-moz-border-radius-topleft: 20px;
-moz-border-radius-bottomleft: 20px;
border-top-left-radius: 20px;
border-bottom-left-radius: 20px;
background-color: rgb(43,194,83);
background-image: -webkit-gradient(
linear,
left bottom,
left top,
color-stop(0, rgb(43,194,83)),
color-stop(1, rgb(84,240,84))
);
background-image: -moz-linear-gradient(
center bottom,
rgb(43,194,83) 37%,
rgb(84,240,84) 69%
);
-webkit-box-shadow:
inset 0 2px 9px rgba(255,255,255,0.3),
inset 0 -2px 6px rgba(0,0,0,0.4);
-moz-box-shadow:
inset 0 2px 9px rgba(255,255,255,0.3),
inset 0 -2px 6px rgba(0,0,0,0.4);
box-shadow:
inset 0 2px 9px rgba(255,255,255,0.3),
inset 0 -2px 6px rgba(0,0,0,0.4);
position: relative;
overflow: hidden;
}
.meter > span:after, .animate > span > span {
content: "";
position: absolute;
top: 0; left: 0; bottom: 0; right: 0;
background-image:
-webkit-gradient(linear, 0 0, 100% 100%,
color-stop(.25, rgba(255, 255, 255, .2)),
color-stop(.25, transparent), color-stop(.5, transparent),
color-stop(.5, rgba(255, 255, 255, .2)),
color-stop(.75, rgba(255, 255, 255, .2)),
color-stop(.75, transparent), to(transparent)
);
background-image:
-moz-linear-gradient(
-45deg,
rgba(255, 255, 255, .2) 25%,
transparent 25%,
transparent 50%,
rgba(255, 255, 255, .2) 50%,
rgba(255, 255, 255, .2) 75%,
transparent 75%,
transparent
);
z-index: 1;
-webkit-background-size: 50px 50px;
-moz-background-size: 50px 50px;
-webkit-animation: move 2s linear infinite;
-webkit-border-top-right-radius: 20px;
-webkit-border-bottom-right-radius: 20px;
-moz-border-radius-topright: 20px;
-moz-border-radius-bottomright: 20px;
border-top-right-radius: 20px;
border-bottom-right-radius: 20px;
-webkit-border-top-left-radius: 20px;
-webkit-border-bottom-left-radius: 20px;
-moz-border-radius-topleft: 20px;
-moz-border-radius-bottomleft: 20px;
border-top-left-radius: 20px;
border-bottom-left-radius: 20px;
overflow: hidden;
}
.animate > span:after {
display: none;
}
@-webkit-keyframes move {
0% {
background-position: 0 0;
}
100% {
background-position: 50px 50px;
}
}
.orange > span {
background-color: #f1a165;
background-image: -moz-linear-gradient(top, #f1a165, #f36d0a);
background-image: -webkit-gradient(linear,left top,left bottom,color-stop(0, #f1a165),color-stop(1, #f36d0a));
background-image: -webkit-linear-gradient(#f1a165, #f36d0a);
}
.red > span {
background-color: #f0a3a3;
background-image: -moz-linear-gradient(top, #f0a3a3, #f42323);
background-image: -webkit-gradient(linear,left top,left bottom,color-stop(0, #f0a3a3),color-stop(1, #f42323));
background-image: -webkit-linear-gradient(#f0a3a3, #f42323);
}
.nostripes > span > span, .nostripes > span:after {
-webkit-animation: none;
background-image: none;
}
#output {
background-color: #ccc;
height: 240px;
overflow-y: auto;
}
</style>
</head>
<body>
<div id="page_wrap">
<h1>Meter Updates via WebSocket</h1>
<p/>
<div class="meter">
<span id="meter1" style="width: 25%"></span>
</div>
<p/>
<div class="meter orange nostripes">
<span id="meter2" style="width: 33.3%"></span>
</div>
<p/>
<div class="meter red">
<span id="meter3" style="width: 80%"></span>
</div>
<p/>
</div>
<div class="button_container">
<div>
<button id="connection" onclick="toggleConnection(this)">WebSocket Connect</button>
<button id="update" disabled onclick="toggleUpdate(this)">Disable Update</button>
</div>
</div>
<p/>
<div id="output"></div>
</body>
<script language="javascript" type="text/javascript">
var connection; // websocket connection
function writeToScreen (message) {
var div = document.createElement('div');
var output = document.getElementById('output');
div.innerHTML = message;
output.appendChild(div);
output.scrollTop = output.scrollHeight;
}
function ws_connect() {
// check for websocket support
// for Internet Explorer < 10 there are options for websocket support that
// could be integrated into production code, but for now, we are expecting
// browser support to be present for this demo
if ('WebSocket' in window) {
writeToScreen('Connecting');
connection = new WebSocket('ws://' + window.location.host + '/meters');
connection.onopen = function(ev) {
document.getElementById("connection").innerHTML = "WebSocket Disconnect";
document.getElementById("update").disabled=false;
document.getElementById("update").innerHTML = "Disable Update";
writeToScreen('CONNECTED');
var message = 'update on';
writeToScreen('SENT: ' + message);
connection.send(message);
};
connection.onclose = function(ev) {
document.getElementById("update").disabled=true;
document.getElementById("update").innerHTML = "Enable Update";
document.getElementById("connection").innerHTML = "WebSocket Connect";
writeToScreen('DISCONNECTED');
};
connection.onmessage = function(ev) {
if (ev.data.substr(0,5) == "meter")
{
var target = ev.data.split(":")[0];
var meter = document.getElementById(target);
var data = ev.data.split(":")[1].split(",");
var percent = (data[0]*100)/data[1];
meter.style.width = percent+"%";
}
else
writeToScreen('RECEIVED: ' + ev.data);
};
connection.onerror = function(ev) {
alert("WebSocket error");
};
} else {
alert("WebSocket is not available!!!\n" +
"Demo will not function.");
}
}
// user connect/disconnect
function toggleConnection(el) {
var tag=el.innerHTML;
if (tag == "WebSocket Connect")
{
ws_connect();
}
else
{
connection.close();
}
}
// user turn updates on/off
function toggleUpdate(el) {
var tag=el.innerHTML;
var message;
if (tag == "Enable Update")
{
message = 'update on';
el.innerHTML = "Disable Update";
}
else
{
message = 'update off';
el.innerHTML = "Enable Update";
}
writeToScreen('SENT: ' + message);
connection.send(message);
}
</script>
</html>