var ws, ws_url = location.protocol.replace(/^http/, 'ws') + '//' + location.host + location.pathname, ws_active = false, ws_connected = false, ws_last_input_time = 0, ws_last_output_time = 0, msg_num = 0, NO_LOG = 1000, log_fifo = [], color_active = false, intervals = {}; function reload() { location.reload(); setTimeout(reload, Math.random() * 3000); } function repeat(str, count) { var result = ''; while (result.length < count) { result += str; } return result; } function pad(str, padding, count) { return (repeat(padding, count) + str).slice(count * -1); } function pad_digit(number) { return pad(number, 0, 2); } function pad_ms(number) { return pad(number, 0, 3); } function ts_to_iso_format(timestamp_milliseconds) { var date = (timestamp_milliseconds ? new Date(timestamp_milliseconds) : new Date()); return date.getFullYear() + '-' + pad_digit(date.getMonth() + 1) + '-' + pad_digit(date.getDate()) + ' ' + pad_digit(date.getHours()) + ':' + pad_digit(date.getMinutes()) + ':' + pad_digit(date.getSeconds()) + '.' + pad_ms(date.getMilliseconds()); } function msg(str) { if (color_active) { return; } var e = document.getElementById('msg'); if (!e) { return; } log_fifo.push('[#' + ++msg_num + ' @ ' + ts_to_iso_format() + '] ' + ws_url + ' ' + str); if (log_fifo.length > 10) { log_fifo.shift(); } e.value = ''; for (var i = 0; i < log_fifo.length; i++) { e.value += log_fifo[i] + '\n'; } e.scrollTop = e.scrollHeight; } function msg_clear() { var e = document.getElementById('msg'); if (e) { e.value = ''; } } function hide(id) { var e = document.getElementById(id); if (e) { e.style.display = 'none'; } } function bg(hexval) { document.getElementsByTagName('body')[0].style.backgroundColor = '#' + hexval; } function color(hexval) { if (!color_active) { color_active = true; hide('content'); bg('000000'); document.title += ' - WebSocket background color changer active'; } bg(hexval); } function ws_ev_open() { ws_connected = true; ws_send('ready rtt color', NO_LOG); msg('ws open'); } function ws_ev_close(e) { ws_connected = false; msg('ws close "' + e.code + '" - "' + e.reason + '" '); } function ws_ev_message(e) { ws_last_input_time = (new Date()).getTime(); var str = e.data; if (str.match(/^idle$/i)) { } else if (str.match(/^(?:[0-9a-f]{3}|[0-9a-f]{6})$/i)) { color(str); } else if (str.match(/^\s*rtt\s+(\d+(?:\.\d+)?)\s*$/i)) { ws_send(str, NO_LOG); } else { msg('ws message "' + str + '"'); } } function ws_ev_error(e) { msg('ws error "' + e.data + '"'); } function ws_toggle() { ws_active = !ws_active; var e = document.getElementById('toggle'); if (e) { e.value = 'WebSocket ' + (ws_active ? 'RUNNING' : 'PAUSED'); } } function ws_send(str, opt) { if (!ws_active || !ws_connected) { return; } if (opt !== NO_LOG) { msg('ws send "' + str + '"'); } ws_last_output_time = (new Date()).getTime(); ws.send(str); } function ws_create() { ws_connected = false; if (!ws_active) { return true; } if (ws && ws.close) { ws.close(); } if (WebSocket) { ws = new WebSocket(ws_url); } else if (MozWebSocket) { ws = new MozWebSocket(ws_url); } else { return false; } ws.addEventListener('open', ws_ev_open, false); ws.addEventListener('close', ws_ev_close, false); ws.addEventListener('message', ws_ev_message, false); ws.addEventListener('error', ws_ev_error, false); return true; } function ws_check() { if (ws_active) { var input_idle = (new Date()).getTime() - ws_last_input_time; if (input_idle >= 60000) { if (!ws_create()) { msg('ws not supported'); alert('ws not supported'); return; } } else if (input_idle >= 20000) { ws_send('idle', NO_LOG); } } if (!intervals.ws_check) { intervals.ws_check = setInterval(ws_check, 10000 + (Math.random() * 5000)); } } function ws_init() { ws_check(); } function ws_periodic() { ws_send(Math.random(), NO_LOG) } function load() { var e_toggle = document.getElementById('toggle'); if (e_toggle) { e_toggle.addEventListener('click', ws_toggle, false); } /* reload(); */ msg_clear(); ws_toggle(); ws_init(); /* setInterval(ws_periodic, 10); */ } function init() { addEventListener('load', load, false); } init();