var FEED_CHECK_TIMEOUT = 10000; // millis
var TIMEOUT = 5000; // millis
var NUM_IN_REQUEST = 50;
var MAX_DISPLAY = 10;

var topId = 0;
var newIds = [];
var vidIds = [];
var counter = 0;
var noResultChange = false;
var firstPoll = true;

function updateReferrers() {
	new Ajax.Updater("referrers", "/referrers");
}

function createEntry(entry) {
	var s = "";
	s = s + "<div class='referrer' id='referrer_" + entry.id + "' style='display:none'>";
	s = s + "<a href='" + entry.url +"'>";
	s = s + "<img src='" + entry.thumb +"'></a>";
	s = s + "<h4><a href='" + entry.url +"'>";
	s = s + entry.title + "</a></h4>";
	s = s + "<span><a href='" + entry.blog + "'>" + entry.blog + "</a></span>";
	s = s + "<span clear='left'>All blog entries: " + entry.linkCount + "</span>";
	s = s + "</div>";

	new Insertion.After('placeholder', s);
	newIds[newIds.length] = entry.id;
	vidIds[vidIds.length] = entry.vidId;
	counter++;
}

var tempObj;
function response(req) {
	try {
		if (req.responseText == "" || req.responseText.indexOf("Exception") != -1) return;

		eval(req.responseText);
		var obj = tempObj;
		var refs = obj.refs;
		if (typeof refs == "undefined") return;
		refs = removeOld(refs);

		var newItemCount = refs.length;
		var mins = obj.mins;
		if (!firstPoll)
			TIMEOUT = (mins * 60 * 1000) / newItemCount

		newIds = [];
		vidIds = [];
		for (var i = 0; i < refs.length; i++) {
			createEntry(refs[i]);
		}

		newIds.reverse(true);
		vidIds.reverse(true);
		showEntries();
	} catch (e) {
		// ignore
		alert(e);
	}
}

var displayCounter = 0;
function showEntries() {
	if (newIds.length == 0) {
		var el = $("referrerUpdate");

		Effect.Appear(el, {duration: 1.2, afterFinish: function() {
				setTimeout('Effect.Fade($("referrerUpdate"))', 1000);
			}
		});

		firstPoll = false;
		if(noResultChange)
			setTimeout(timeoutCaller, FEED_CHECK_TIMEOUT);
		else
			timeoutCaller();
		return;
	}

	var id = newIds[newIds.length - 1];

	var divs = $("referrers").getElementsByTagName("div");

	if (divs.length > MAX_DISPLAY) {
		if (displayCounter >= MAX_DISPLAY) {
			var div = divs[divs.length - 1];
			Effect.Fade(div, {afterFinish: function() {
				$("referrers").removeChild(div);
				appear(id);
			}});
		}
		else {
			appear(id);
			displayCounter++;
		}

	}
	else
		appear(id);
}

function appear(id) {
	Effect.Appear("referrer_" + id);

	var vidId = vidIds[vidIds.length - 1];
	var div = $("vid_tom_" + vidId);
	if (div != null) {
		new Effect.Pulsate(div, {afterFinish: function() {
			Element.setOpacity(div, 1);
		}});
	}

	newIds.pop();
	vidIds.pop();

	if (newIds.length == 0) {
		topId = id;
	}

	if (firstPoll) {
		slow = (Math.round(Math.random()*4) == 1);
		TIMEOUT = 500 + Math.round(1000*Math.random())+ (Math.round(10000*Math.random()) * slow);
	}

	setTimeout(showEntries, TIMEOUT);
}

function removeOld(refs) {
	noResultChange = false;
	var newRefs = [];

	var foundNew = false;
	for (var i = refs.length - 1; i >= 0; i--) {
		var ref = refs[i];

		if (foundNew) {
			newRefs[newRefs.length] = ref;
		}

		if (!foundNew && ref.id == topId) {
			foundNew = true;
		}
	}

	if (!foundNew) {
		newRefs = refs.reverse(true);
	}

	if (newRefs == 0)
		noResultChange = true;

	return newRefs;
}

function timeoutCaller() {
	new Ajax.Request("/referrers", {onComplete: response, method: 'get', requestHeaders: []});
}

timeoutCaller();
//Event.observe(window, "load", timeoutCaller, false);
