try {
    new ActiveXObject("Msxml2.XMLHTTP");
    getXHR = function() {
        return new ActiveXObject("Msxml2.XMLHTTP");
    }
} catch (e) {
    try {
        new ActiveXObject("Microsoft.XMLHTTP");
        getXHR = function() {
            return new ActiveXObject("Microsoft.XMLHTTP");
        }
    } catch (e) {
        if (typeof XMLHttpRequest !== 'undefined') {
            getXHR = function() {
                return new XMLHttpRequest();
            }
        } else {
            alert("Something went really wrong!");
            console.log("XHR is not available");
        }
    }
}

function getURL(url, params, callback) {
    if (Object.keys(params).length > 0) {
        var pairs = [];
        for (key in params) {
            pairs.push(key +'='+ encodeURIComponent(params[key]))
        }
        url += '?'+ pairs.join('&');
    }

    var xhr = getXHR();
    xhr.open('GET', url, true);
    xhr.onreadystatechange = function() {
        if (xhr.readyState === 4) {
            if(xhr.status === 200) {
                callback(JSON.parse(xhr.responseText));
            }
        }
    };
    xhr.send(null);
}