var FutamiCommon = function(vars) {
    vars = vars || {};

    var get = function(name, fallback) {
        return vars[name] || fallback || null;
    };

    return {
        get: get,
        getJson: function(name, onload, onerror, noCache) {
            if(typeof onload !== 'function')
                throw 'onload must be specified';

            var xhr = new XMLHttpRequest;
            xhr.onload = function() {
                onload(JSON.parse(xhr.responseText));
            };
            if(typeof onerror === 'function')
                xhr.onerror = function() { onerror(); };
            xhr.open('GET', get(name));
            if(noCache)
                xhr.setRequestHeader('Cache-Control', 'no-cache');
            xhr.send();
        },
        getApiJson: function(path, onload, onerror, noCache) {
            if(typeof onload !== 'function')
                throw 'onload must be specified';

            var xhr = new XMLHttpRequest;
            xhr.onload = function() {
                onload(JSON.parse(xhr.responseText));
            };
            if(typeof onerror === 'function')
                xhr.onerror = function() { onerror(); };
            xhr.open('GET', get('api') + path);
            if(noCache)
                xhr.setRequestHeader('Cache-Control', 'no-cache');
            xhr.send();
        },
    };
};

FutamiCommon.load = function(callback, url) {
    if(typeof callback !== 'function')
        throw 'there must be a callback';
    if(typeof url !== 'string' && 'FUTAMI_URL' in window)
        url = window.FUTAMI_URL + '?t=' + Date.now().toString();

    var xhr = new XMLHttpRequest;
    xhr.onload = function() {
        try {
            callback(new FutamiCommon(JSON.parse(xhr.responseText)));
        } catch(ex) {
            callback(false);
        }
    };
    xhr.onerror = function() {
        callback(false);
    };
    xhr.open('GET', url);
    xhr.setRequestHeader('Cache-Control', 'no-cache');
    xhr.send();
};