/*
	Copyright (c) 2004-2006, The Dojo Foundation
	All Rights Reserved.

	Licensed under the Academic Free License version 2.1 or above OR the
	modified BSD license. For more information on Dojo licensing, see:

		http://dojotoolkit.org/community/licensing.shtml
*/

dojo.require("dojo.Deferred");
dojo.provide("dojo.DeferredList");
dojo.DeferredList = function (list, fireOnOneCallback, fireOnOneErrback, consumeErrors, canceller) {
	this.list = list;
	this.resultList = new Array(this.list.length);
	this.chain = [];
	this.id = this._nextId();
	this.fired = -1;
	this.paused = 0;
	this.results = [null, null];
	this.canceller = canceller;
	this.silentlyCancelled = false;
	if (this.list.length === 0 && !fireOnOneCallback) {
		this.callback(this.resultList);
	}
	this.finishedCount = 0;
	this.fireOnOneCallback = fireOnOneCallback;
	this.fireOnOneErrback = fireOnOneErrback;
	this.consumeErrors = consumeErrors;
	var index = 0;
	var _this = this;
	dojo.lang.forEach(this.list, function (d) {
		var _index = index;
		d.addCallback(function (r) {
			_this._cbDeferred(_index, true, r);
		});
		d.addErrback(function (r) {
			_this._cbDeferred(_index, false, r);
		});
		index++;
	});
};
dojo.inherits(dojo.DeferredList, dojo.Deferred);
dojo.lang.extend(dojo.DeferredList, {_cbDeferred:function (index, succeeded, result) {
	this.resultList[index] = [succeeded, result];
	this.finishedCount += 1;
	if (this.fired !== 0) {
		if (succeeded && this.fireOnOneCallback) {
			this.callback([index, result]);
		} else {
			if (!succeeded && this.fireOnOneErrback) {
				this.errback(result);
			} else {
				if (this.finishedCount == this.list.length) {
					this.callback(this.resultList);
				}
			}
		}
	}
	if (!succeeded && this.consumeErrors) {
		result = null;
	}
	return result;
}, gatherResults:function (deferredList) {
	var d = new dojo.DeferredList(deferredList, false, true, false);
	d.addCallback(function (results) {
		var ret = [];
		for (var i = 0; i < results.length; i++) {
			ret.push(results[i][1]);
		}
		return ret;
	});
	return d;
}});

