/*
 * jQueue - clase simple de cola de trabajos.
 *
 * Los trabajos se añaden utilizando el método add(), y a cada trabajo
 * se le pasará un parámetro que será el propio objeto jQueue en uso.
 *
 * Cuando el trabajo termine, deberá ocuparse de llamar al método ready()
 * del objeto jQueue suministrado, para que éste vuelva a tener el control
 * de la ejecución. De lo contrario, la cola terminará en ese punto.
 *
 * La ejecución comienza cuando se llama al método start() del objeto
 * jQueue. Cuando la cola finalice, ésta será restablecida, y cualquier llamada
 * subsiguiente a start() comenzará desde el principio.
 *
 * El siguiente ejemplo imprimirá trés alerts conteniendo "a", "b" y "2"
 * sucesivamente:
 *   var q = new jQueue();
 *   q.add(function(qObj){ alert('a'); qObj.ready(); });
 *   q.add(function(qObj){ alert('b'); qObj.ready(); });
 *   q.add(function(qObj){ alert(qObj.position); qObj.ready(); });
 *   q.start();
 */
function jQueue() {};

jQueue.prototype = {
	position: 0,
	data: null,
	_events: [],

	reset: function(){
		this.position = 0;
	},

	_next: function(){
		if(this.position < this._events.length){
			var ev = this._events[this.position];
			ev(this);
		}else{
			this.reset();
		}
	},

	ready: function(){
		this.position++;
		this._next();
	},

	isFirst: function(){
		return this.position == 0;
	},

	isLast: function(){
		return this.position == this._events.length - 1;
	},

	add: function(event){
		this._events[this._events.length] = event;
	},

	start: function(){
		this._next();
	}
}
