function directoryStructure(uri, directories) {
    var fx = function(o) {
        var json = o.responseJSON;
        if (json.directories && json.directories.length) {
            for (var d = 0; d < json.directories.length; d++) {
                directories[directories.length] = json.directories[d];
            }
        }
    };
    structureRequest(uri + "/dir", {onSuccess:fx});
}

function fileStructure(uri, files) {
    var fx = function(o) {
        var json = o.responseJSON;
        if (json.files && json.files.length) {
            for (var f = 0; f < json.files.length; f++) {
                files[files.length] = json.files[f];
            }
        }
    };

    structureRequest(uri + "/dir", {onSuccess:fx});
}

function childrenStructure(uri, childrenUris) {
    var fx = function(o) {
        var json = o.responseJSON;
        if (json.children && json.children.length) {
            for (var i = 0; i < json.children.length; i++) {
                childrenUris[childrenUris.length] = json.children[i];
            }
        }
    };

    structureRequest(uri + "/meta", {onSuccess:fx});
}

function tabularStructure(uri, projections, rowHandlerCallback) {
    var fx = function(o) {
        var json = o.responseJSON;
        if (json.children && json.children.length) {
            for (var i = 0; i < json.children.length; i++) {
                rowHandlerCallback(json.children[i]);
            }
        }
    };

    structureRequest(uri + "/meta", {onSuccess:fx, parameters: {PROJECTION: projections} });
}

function structureRequest(uri, options) {
    var onSuccessCallback = function() {};
    var parameters = {};
    if (options.onSuccess) onSuccessCallback = options.onSuccess;
    if (options.parameters) parameters = options.parameters;

    new Ajax.Request(uri, {
        method: "get",
        parameters: parameters,
        asynchronous: false,
        onSuccess: onSuccessCallback,
        onException: function(o, ex) {
            console.error(o + ":" + ex);
        },
        onFailure: function(o, ex) {
            console.error(o + ":" + ex);
        }
    });
}
