//= evil-front/core

(function() {

// Call `callback` only after previous callback of `name` queue
// will be finished. It is useful to animation.
//
// b.link.click ->
//   evil.queue 'link', (done) ->
//     $.get $(@).url, (html) ->
//       animation html, ->
//         done()
evil.queue = function(name, callback) {
    if ( typeof(name) == 'function' ) {
        callback = name;
        name     = 'default';
    }

    if ( typeof(waiters[name]) == 'undefined' ) {
        waiting[name] = false;
        waiters[name] = [];
    }

    if ( waiting[name] ) {
        waiters[name].push(callback);
    } else {
        call(name, callback);
    }
};

var waiting = { };
var waiters = { };

var call = function(name, callback) {
    waiting[name] = true;
    callback(function () {
        waiting[name] = false;
        var waiter = waiters[name].pop();
        if ( waiter ) {
            call(name, waiter);
        }
    });
};

})();