var BoxUpdater = function () {
	
	var boxes = [];

	var updateIndex = 0;
	
	function update() {
		if (boxes.length <= 0) {
			stop();
			return;
		}

		if (updateIndex >= boxes.length) {
			updateIndex = 0;
		}

		var box = boxes[updateIndex];
		++ updateIndex;
		var genResult = box.dataGenerator();
		var data = genResult.data;
		box.dataGenerator = genResult.dataGenerator;
		var inner = box.element.find(".inner");
		var newInner = inner.clone();
		newInner.css("visibility","hidden").css("position","absolute");
		newInner.find(".centre_pic a").attr("href", data.link);
		newInner.find("img").replaceWith("<img />");
		newInner.find("img").attr("src", data.image).attr("alt", data.alt).attr("title", data.alt);
		newInner.find(".updating_box_title").text(data.title);
		newInner.find(".updating_box_subtitle").text(data.subtitle);
		newInner.insertBefore(inner);
		inner.fadeOut(200, function () {
			inner.remove();
			newInner.css("display","none").css("visibility","visible").css("position","static");
			newInner.fadeIn(400);
		});
	}

	
	function ensureInit() {
		if (!running) {
			start();
		}
	}

	var running = false;
	
	var interval;

	function start() {
		$(document).ready(function () {
			interval = setInterval(update, 2000);
		});
		running = true;
	}

	function stop() {
		clearInterval(interval);
		interval = null;
		running = false;
	}

	
	
	return {
		registerBox: function (id, dataGenerator) {
			var boxElement = document.getElementById(id);
			if (!boxElement) {
				return;
			}
			var box = $(document.getElementById(id));
			boxes.push({ element: box, dataGenerator: dataGenerator });
			ensureInit();
		},
		registerAJAXBox: function (id, url) {
			BoxUpdater.registerBox(id, BoxUpdater.getAJAXBoxDataGenerator(url));
		},
		getTestBoxDataGenerator: function (n, i) {
			var pos = 0;
			var sequence = [
				{ link: "link" + n + "?1", image: "../example_pics/games_block_picTall.jpg", alt: "alt" + n + "?1", title: "title" + n + "?1", subtitle: "artist" + n + "?1" },
				{ link: "link" + n + "?2", image: "../example_pics/games_block_picwide.jpg", alt: "alt" + n + "?2", title: "title" + n + "?2", subtitle: "artist" + n + "?2" },
				{ link: "link" + n + "?3", image: "../example_pics/games_block_pic.jpg", alt: "alt" + n + "?3", title: "title" + n + "?3", subtitle: "artist" + n + "?3" }
			];
					                
			function generator() {
				if (pos >= sequence.length) {
					pos = 0;
				}
				var data = sequence[pos ++];
				return { 
					data: data, 
					dataGenerator: generator 
				};
			};
			return generator;
		},
		getAJAXBoxDataGenerator: function (url) {
			var pos = 1; // skip 0th item, on the assumption we start off with it already showing
			var sequence = [];
			$.get(url, function (data) {
				$(data).find("item").each(function () {
					var item = $(this);
					var boxData = { 
							link: item.find("link").text(),
							image: item.find("image").text(),
							alt: item.find("alt").text(),
							title: item.find("title").text(),
							subtitle: item.find("subtitle").text()
					};
					sequence.push(boxData);
				});
			});
			function generator() {
				if (sequence.length <= 0) {
					return { dataGenerator: generator };
				}
				if (pos >= sequence.length) {
					pos = 0;
				}
				var data = sequence[pos ++];
				return {
					data: data,
					dataGenerator: generator
				};
			}
			return generator;
		}
	};
}();
