var __SERVER__NAME = "{{host}}";
var __PORT = {{ports[ws][0]}};
var __SECURE__PORT = {{ports[wss][0]}};
var __NEW__PORT = __PORT; //All ports are non-default for now
var __NEW__SECURE__PORT = __SECURE__PORT; //All ports are non-default for now
var __PATH = "echo";
var wsocket;
var data;

function IsWebSocket() {
    if (!self.WebSocket) {
        assert_true(false, "Browser does not support WebSocket");
    }
}

function CreateWebSocketNonAbsolute() {
    IsWebSocket();
    var url = __SERVER__NAME;
    wsocket = new WebSocket(url);
}

function CreateWebSocketNonWsScheme() {
    IsWebSocket();
    var url = "http://" + __SERVER__NAME + ":" + __PORT + "/" + __PATH;
    wsocket = new WebSocket(url);
}

function CreateWebSocketNonAsciiProtocol(nonAsciiProtocol) {
    IsWebSocket();
    var url = "ws://" + __SERVER__NAME + ":" + __PORT + "/" + __PATH;
    wsocket = new WebSocket(url, nonAsciiProtocol);
}

function CreateWebSocketWithAsciiSep(asciiWithSep) {
    IsWebSocket();
    var url = "ws://" + __SERVER__NAME + ":" + __PORT + "/" + __PATH;
    wsocket = new WebSocket(url, asciiWithSep);
}

function CreateWebSocketWithBlockedPort(blockedPort) {
    IsWebSocket();
    var url = "ws://" + __SERVER__NAME + ":" + blockedPort + "/" + __PATH;
    return new WebSocket(url);
}

function CreateWebSocketWithSpaceInUrl(urlWithSpace) {
    IsWebSocket();
    var url = "ws://" + urlWithSpace + ":" + __PORT + "/" + __PATH;
    wsocket = new WebSocket(url);
}

function CreateWebSocketWithSpaceInProtocol(protocolWithSpace) {
    IsWebSocket();
    var url = "ws://" + __SERVER__NAME + ":" + __PORT + "/" + __PATH;
    wsocket = new WebSocket(url, protocolWithSpace);
}

function CreateWebSocketWithRepeatedProtocols() {
    IsWebSocket();
    var url = "ws://" + __SERVER__NAME + ":" + __PORT + "/" + __PATH;
    wsocket = new WebSocket(url, ["echo", "echo"]);
}

function CreateWebSocketWithRepeatedProtocolsCaseInsensitive() {
    IsWebSocket();
    var url = "ws://" + __SERVER__NAME + ":" + __PORT + "/" + __PATH;
    wsocket = new WebSocket(url, ["echo", "eCho"]);
}

function CreateWebSocket(isSecure, isProtocol, isProtocols) {
    IsWebSocket();
    var url;
    if (isSecure) {
        if (__SECURE__PORT === null) {
            throw new Error("wss not yet supported");
        }
        url = "wss://" + __SERVER__NAME + ":" + __SECURE__PORT + "/" + __PATH;
    }
    else {
        url = "ws://" + __SERVER__NAME + ":" + __PORT + "/" + __PATH;
    }

    if (isProtocol) {
        wsocket = new WebSocket(url, "echo");
    }
    else if (isProtocols) {
        wsocket = new WebSocket(url, ["echo", "chat"]);
    }
    else {
        wsocket = new WebSocket(url);
    }
    return wsocket;
}

function CreateControlWebSocket(isSecure) {
    IsWebSocket();
    var url;
    if (isSecure) {
        url = "wss://" + __SERVER__NAME + ":" + __SECURE__PORT + "/control";
    }
    else {
        url = "ws://" + __SERVER__NAME + ":" + __PORT + "/control";
    }

    return new WebSocket(url);
}

