/* * This file is part of the jquery plugin "asyncQueue". * * (c) Sebastien Roch <roch.sebastien@gmail.com> * @author (parallel) Dmitry Farafonov * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ (function ($) { $.AsyncQueue = function () { var that = this, queue = [], completeFunc, failureFunc, paused = false, lastCallbackData, _run, _complete, inQueue = 0, defaultTimeOut = 10; _run = function () { var f = queue.shift(); if (f) { inQueue++; setTimeout(function () { f.fn.apply(that, [that]); if (!f.isParallel) if (paused === false) { _run(); } inQueue--; if (inQueue == 0 && queue.length == 0) _complete(); }, f.timeOut); if (f.isParallel) if (paused === false) { _run(); } } }; _complete = function () { if (completeFunc) completeFunc.apply(that, [that]); }; this.onComplete = function (func) { completeFunc = func; }; this.onFailure = function (func) { failureFunc = func; }; this.add = function (func) { // TODO: add callback for queue[i] complete var obj = arguments[0]; if (obj && Object.prototype.toString.call(obj) === "[object Array]") { var fn = arguments[1]; var timeOut = (typeof (arguments[2]) != "undefined") ? arguments[2] : defaultTimeOut; if (typeof (fn) == "function") { for (var i = 0; i < obj.length; i++) { var f = function (objx) { queue.push({ isParallel: true, fn: function () { fn.apply(that, [that, objx]); }, timeOut: timeOut }); }(obj[i]) } } } else { var fn = arguments[0]; var timeOut = (typeof (arguments[1]) != "undefined") ? arguments[2] : defaultTimeOut; queue.push({isParallel: false, fn: func, timeOut: timeOut}); } return this; }; this.addParallel = function (func, timeOut) { // TODO: add callback for queue[i] complete queue.push({isParallel: true, fn: func, timeOut: timeOut}); return this; }; this.storeData = function (dataObject) { lastCallbackData = dataObject; return this; }; this.lastCallbackData = function () { return lastCallbackData; }; this.run = function () { paused = false; _run(); }; this.pause = function () { paused = true; return this; }; this.failure = function () { paused = true; if (failureFunc) { var args = [that]; for (i = 0; i < arguments.length; i++) { args.push(arguments[i]); } failureFunc.apply(that, args); } }; this.size = function () { return queue.length; }; return this; } })(jQuery);