////////////////////////////////////////////////////////////////////////
// HTTPServer API
///////////////////////////////////////////////////////////////////////
var HTTPServer = {
    _this: this, // Avoid conflicts between HTTPServer and Winsock variables

    StatusCodes: {
        100: "Continue",
        200: "OK",
        206: "Partial Content",
        301: "Moved Permanently",
        302: "Found",
        304: "Not Modified",
        400: "Bad Request",
        401: "Unauthorized",
        403: "Forbidden",
        404: "Not Found",
        500: "Internal Server Error",
        503: "Service Unavailable"
    },

    Listener: null,

    Connections: {},

    CreateWinsockObject: function() {
        return CreateObject([
            "MSWinsock.Winsock.1",
            "MSWinsock.Winsock"
        ], "listener_");
    },

    Bind: function(port) {
        try {
            _this.Listener = _this.CreateWinsockObject();
            _this.Listener.localPort = port;
            _this.Listener.bind();
            _this.Listener.listen();
            console.info("Listening port: " + port);
        } catch (e) {
            console.error("port ", port, " could not bind: ", e.message);
        }
    },

    OnRequest: function(request, response) {
        console.log("HTTPServer.OnRequest() dose not implemented");
    },

    CreateServer: function(OnRequest) {
        if (typeof OnRequest !== "function") {
            throw new TypeError("OnRequest() must be a function.");
        }
        _this.OnRequest = OnRequest;

        return HTTPServer;
    },

    ConnectionRequest: function(requestID) {
        console.info("Connection request " + requestID);

        _this.Connections[requestID] = {
            Listener: _this.CreateWinsockObject()
        };
        _this.Connections[requestID].Listener.accept(requestID);
    },

    DataArrival: function(length) {
        // TODO: DataArrival
    },

    SendComplete: function() {
        // TODO: SendComplete
    }
};

global.listener_ConnectionRequest = HTTPServer.ConnectionRequest;
global.listener_DataArrival = HTTPServer.DataArrival;
global.listener_SendComplete = HTTPServer.SendComplete;

exports = HTTPServer;