function HttpRequest(method, url, payload, callback, context) {
    if (!window.XMLHttpRequest) {
        return;
    }

    var request = new XMLHttpRequest();
    var async = typeof callback !== 'undefined';

    if (async) {
        request.onreadystatechange = function() {
            if (request.readyState !== 4) {
                return;
            }

            if (request.responseText !== null && request.status === 200) {
                var obj = JSON.parse(request.responseText);
                if (obj.error) {
                    alert(obj.error);
                    return;
                }
                else {
                    callback(obj, context);
                }
            }
        };
    }

    if (method === 'get') {
        request.open('GET', url, async);
        request.send(null);
    } else {
        request.open('POST', url, async);
        request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
        request.send(payload);
    }

    return request;
};