var bn_cb = undefined;
var bn_function_queue = [];
var bn_queue_Running = false;

function bn_trigger(cb, to) {
    bn_cb = cb;
    if (!to) {
        to = 300;
    }
    window.setTimeout(function () {
        if (bn_cb && bn_cb === cb) {
            bn_cb();
        }
    }, to);
}

function bn_queue(cb, onFinish) {
    bn_function_queue.push(cb);
    if (!bn_queue_Running) {
        if (onFinish) {
            bn_queue_Running = onFinish;
        } else {
            bn_queue_Running = true;
        }
        window.setTimeout(bn_runQueue, 10);
    }
}

function bn_runQueue() {
    if (bn_function_queue.length > 0) {
        window.setTimeout(function () {
            for (i = 45; i > 0; i--) {
                var cb = bn_function_queue.shift();
                if (cb) {
                    cb.call();
                } else {
                    if (bn_queue_Running && bn_queue_Running != true) {
                        bn_queue_Running();
                    }
                    bn_queue_Running = false;
                }
            }
            bn_runQueue();
        });
    } else {
        if (bn_queue_Running && bn_queue_Running != true) {
            bn_queue_Running.call();
        }
        bn_queue_Running = false;
    }
}

function bn_queued_each(el, cb, onDone) {
    var q = new Queue();
    $.each(el, function () {
        q.add(cb, this);
    });
    if (onDone) {
        q.add(onDone);
    }
    q.start();
}

function Queue() {
    var _this = this;
    this.queue = [],
    running = false;

    this.add = function (cb, o) {
        _this.queue.push({ callback: cb, object: o });
    }

    this.start = function () {
        window.setTimeout(_this.run);
    }

    this.run = function () {
        if (_this.queue.length < 1) {
            return;
        }
            var scope = _this.queue.shift();
        window.setTimeout(function () {
            scope.callback.apply(scope.object);
            _this.run();
        });
    }
    this.next = function () {
        if (_this.queue.length < 1) {
            return false;
        }
            var scope = _this.queue.shift();
        window.setTimeout(function () {
            scope.callback.apply(scope.object);
        });
        return true;
    }
}
