AJX = {};

AJX.createXmlHttpRequest = function() {
    if (window.XMLHttpRequest) {
        return new XMLHttpRequest();
    } else if (window.ActiveXObject) {
        return new ActiveXObject("Msxml2.XMLHTTP");
    } else {
        throw "Can't create XMLHttpRequest";
    }
}

AJX.setHandlerToHttpRequest = function(request, onload, onerror) {
    request.onreadystatechange = function() {
        if (request.readyState != 4) {
            return;
        }
        try {
            if (request.status != 200) {
                if (onerror) {
                    onerror(request.status);
                }
                return;
            }
        } catch (e) {
            if (onerror) {
                onerror();
            }
            return;
        }
        onload(request.responseText);
    }
}

function Server() {};

Server.prototype.init = function(url, parameters, onload, onerror) {
    this.onload = onload;
    this.onerror = onerror;
    
    var request = AJX.createXmlHttpRequest();
    request.open('POST', url, true);
    request.setRequestHeader('Content-Type', 'text/javascript');
    var requestData = JSN.serialize(parameters);
    AJX.setHandlerToHttpRequest(
        request,
        VAR.createCaller(this, 'onRequestLoad')
    );
    request.send(requestData);
}

Server.prototype.onRequestLoad = function(responseText) {
    var message = JSN.unserialize(responseText);
    if (!message) {
        return;
    }
    if (message.error) {
        if (this.onerror) {
            this.onerror(message);
        }
        return;
    }
    if (this.onload) {
        this.onload(message);
    }
}