/************* UseTracker ***************/
/*  Copyright 2002 William P Wood, Jr   */
/************* UseTracker ***************/

function UseTracker(numItems, items)
{
	this.numItems = numItems;
	this.items = items;
	this.useCount = 0;
	this.current = null;
	this.history = null;
	this.mode = "Standard";
}

UseTracker.prototype.useCycle = function(num0)
{
	return(Math.floor(num0/this.numItems));
}

UseTracker.prototype.trackUse = function(num0)
{
	var lastUsed;
//	var wt=window.top.frames["thumbnails"];

	if (num0 != null) {
		lastUsed = this.items[num0].lastUsed == null ? -this.numItems : this.items[num0].lastUsed;
		this.current = num0;
		if (num0 == this.history)
			return;
		else
			this.history = null;
		if (this.useCycle(lastUsed) >= this.useCycle(this.useCount)) {
			for (var i = 0; i < this.numItems; i++)
				if (this.items[i].lastUsed != null)
					if (this.items[i].lastUsed > lastUsed) {
						this.items[i].lastUsed -= 1;
//						if (wt.imageTracker == this) wt.document.images[i].title="item: " + i + " last: " + (this.items[i].lastUsed);
						}
			}
		else
			this.useCount += 1;
		this.items[num0].lastUsed = this.useCount - 1;
//		if (wt.imageTracker == this) wt.document.images[num0].title="item: " + num0 + " last: " + (this.useCount-1);
		}
}

UseTracker.prototype.prevItemHistory = function() {
	var historyLastUsed;
	var maxLastUsed;
	
	if (this.current == null)
		return(0);
	if (this.history == null)
		this.history = this.current;
	historyLastUsed = this.items[this.history].lastUsed;
	maxLastUsed = -1;
	for (var i = 0; i < this.numItems; i++)
		if (this.items[i].lastUsed != null)
			if (this.items[i].lastUsed > maxLastUsed && this.items[i].lastUsed < historyLastUsed) {
				maxLastUsed = this.items[i].lastUsed;
				this.history = i;
				}
	return(this.history);
}

UseTracker.prototype.nextItemHistory = function() {
	var historyLastUsed;
	var minLastUsed;
	
// can only get here if (this.current != null && this.history != null && this.items[this.current].lastUsed != this.useCount - 1)
	historyLastUsed = this.items[this.history].lastUsed;
	minLastUsed = this.useCount;
	for (var i = 0; i < this.numItems; i++)
		if (this.items[i].lastUsed != null)
			if (this.items[i].lastUsed < minLastUsed && this.items[i].lastUsed > historyLastUsed) {
				minLastUsed = this.items[i].lastUsed;
				this.history = i;
				}
	return(this.history);
}

UseTracker.prototype.prevItem = function() {
	var prevItem;

	if (this.numItems <= 0)
		prevItem = null;
	else if (this.numItems == 1)
		prevItem = 0;
	else if (this.mode == "Random")
		prevItem = this.prevItemHistory();
	else {
		prevItem = this.current == null ? 0 : this.current - 1;
		if (prevItem < 0)
			prevItem = this.numItems - 1;
		}
	return(prevItem);
}

UseTracker.prototype.nextItem = function(isUserRequest) {
	var nextItem;

	if (this.numItems <= 0)
		nextItem = null;
	else if (this.numItems == 1)
		nextItem = 0;
	else if (this.mode == "Standard" || (this.mode == "Repeat" && isUserRequest)) {
		nextItem = this.current == null ? 0 : this.current + 1;
		if (nextItem >= this.numItems)
			nextItem = 0;
		}
	else if (this.mode == "Repeat")
		nextItem = this.current == null ? 0 : this.current;
	else if (isUserRequest && this.current != null && this.history != null && this.items[this.current].lastUsed != this.useCount - 1)
		nextItem = this.nextItemHistory();
	else {
		var useCycle = this.useCycle(this.useCount);
		var nextItemLastUsed;
		var ran = Math.min(this.numItems - 1, Math.floor(Math.random()*this.numItems));

		do {
			nextItem = Math.min(this.numItems - 1, Math.floor(Math.random()*this.numItems));
			if (this.items[nextItem].lastUsed != null)
				nextItemLastUsed = this.items[nextItem].lastUsed;
			else
				nextItemLastUsed = -this.numItems;
			} while ((this.useCycle(nextItemLastUsed) >= useCycle) ||		// insure every item selected once/cycle
						(nextItemLastUsed >= this.useCount - ran));		// give priority to items not selected in awhile
		}
	return(nextItem);
}
