function HTTPRequest() {
    this.bSync = false;
    this.events = ['start', 'open', 'send', 'load', 'end'];
}

HTTPRequest.prototype = {
    connection: function() {
        var alter = ['MSXML2.XMLHTTP.6.0','MSXML2.XMLHTTP.5.0','MSXML2.XMLHTTP.4.0','MSXML2.XMLHTTP.3.0','MSXML2.XMLHTTP','Microsoft.XMLHTTP'];
        try {
            return new XMLHttpRequest();
        } catch (e) {
            for (var i = 0, ln = alter.length; i < ln; i++) {
                try {
                    return new ActiveXObject(alter[i])
                } catch (e) {}
            }
        }
    },
    prepareParams: function(params) {
        var a = [];
        for (var k in params) {
            if ('function' !== typeof params[k]) {
                a[a.length] = k + '=' + params[k];
            }
        }
        return a.join('&');
    },
    get: function (url, params, actions) {
        return this.request(
            'GET', url + (url.indexOf('?') + 1 ? '&' : '?') + this.prepareParams(params), null, actions, null
        );
    },
    post: function (url, params, actions) {
        return this.request(
            'POST', url, params = this.prepareParams(params), actions,
            {
                Connection:'close', 'Content-Length':params.length,
                Method:'POST ' + url + ' HTTP/1.1',
                'Content-Type':'application/x-www-form-urlencoded;'
            });
    },
    request: function (method, url, content, actions, headers) {
        var data = this, connection = this.connection(), bEndOnly = actions instanceof Function;
        try {
            connection.open(method, url, !this.bSync);
            this.bSync || (connection.onreadystatechange = function() {
                var state = data.events[connection.readyState];
                if (bEndOnly && state === 'end') {
                    actions(connection);
                }
                if (state in actions) {
                    actions[state](connection);
                }
            });
            try{
                for(var i in headers) {
                    if('function' !== typeof headers[i]) {
                        connection.setRequestHeader(i, headers[i])
                    }
                }
            } catch(e1) { }
            connection.send(content);
            this.bSync && (bEndOnly ? actions(connection) : actions.end && actions.end(connection));
            return true;
        } catch (e) {
            return false;
        }
    }
};
