var stars = new Array();
var validplotsquares = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,276,277,278,279,280,281,282,283,284,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,338,339,340,341,342,343,344,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,401,402,403,404,405,406,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,462,463,464,465,466,467,470,471,472,473,474,475,476,477,478,479,480,481,482,524,525,526,527,528,531,532,533,534,535,536,537,538,539,540,541,586,587,588,589,592,593,594,595,596,597,598,599,600,649,654,655,656,657,658,659,660,709,710,715,716,717,718,719,720,769,770,771,776,777,778,779,780,831,832,836,837,838,839,840,893,896,897,898,899,900,953,954,955,956,957,958,959,960,1014,1015,1016,1017,1018,1019,1020,1076,1077,1078,1079,1080,1137,1138,1139,1140];
var squaresperrow = 60;
var pxpersquare = 15;
var angstdata = {};

$(document).ready(function() {

	// Image headings
	$("#content H3").each(function() { this.style.background = "url(/lib/img/imagetext/01119306100523223724016/" + doapos(encodeURIComponent(this.firstChild.innerHTML)) + ") bottom left no-repeat"; } );
	$("#nav H3").each(function() { this.style.background = "url(/lib/img/imagetext/01121710701700000000013/" + doapos(encodeURIComponent(this.firstChild.innerHTML)) + ") bottom left no-repeat"; } );

	// Code formatting
	$("textarea").each(function() {
		if (this.name == "code") {
			var content = this.value;
			content = content.replace(/^\s*|\s*$/g,"");
			content = content.replace(/\</g, "&#60;");
			content = content.replace(/\>/g, "&#62;");
			var newcontent = "";
			var linebreak = 0;
			lines = content.split("\n");
			for (var j=0; j<lines.length; j++) {
				lines[j] = lines[j].replace(/\s*$/g,"");
				if (!lines[j].length) {
					linebreak = 1;
				} else {
					var t = 0;
					while (lines[j].charAt(t)=="\t") t++;
					if (t) {
						lines[j] = lines[j].replace(/^\t*/g,"");
						for (var x=1; x<=t; x++) lines[j] = "<span>"+lines[j]+"</span>";
					}
					newcontent += "<li";
					if (linebreak) {
						newcontent += " class=\"linebreak\"";
						linebreak = 0;
					}
					newcontent += ">"+lines[j]+"</li>";
				}
			}
			if (lines.length > 1) {
				newcontent = "<div class=\"code\"><ol>"+newcontent+"</ol></div>";
			} else {
				newcontent = "<div class=\"code\"><ul>"+newcontent+"</ul></div>";
			}
			$(this).before(newcontent).remove();
		}
	});

	// Welcome message
	$("#starintro").fadeIn("medium");
	setTimeout("$(\"#starintro\").fadeOut(2000)", 5000);

	// Read/generate host ID
	var hostid = readOrSetCookie();

	// Initialise Meteor
	Meteor.hostid = hostid;
	Meteor.host = "data."+location.hostname;
	Meteor.registerEventCallback("process", newHit);
	Meteor.joinChannel("demo", 5);
	Meteor.mode = (location.search.indexOf("poll") != -1) ? 'smartpoll' : 'stream';
	if (location.search.indexOf("debug") != -1) {
		Meteor.debugmode=true;
		$("#starintro").after('<div id="meteorlogoutput" style="position: absolute; top: 5px; right: 5px; width: 500px; background-color: white; font-family: monospace; font-size: 10px; line-height: 100%; padding: 5px"></div>');
	}
	if ($("#angstgraph").length) Meteor.joinChannel("angst", 25);
	setTimeout("Meteor.connect();", 1500);

	// Graph
	$("#angstgraph").attr("src", "/examples/angstgraph1");

	setInterval("update()", 1000);
});

function newHit(datastr) {

	eval("var data = "+datastr+";");

	if (data.w && $("#datatable1").length) {
		if ($("#wordrow_"+data.w).length) {
			var prev = $("#wordrow_"+data.w+" td.c").html();
			var change = Math.round(Math.abs(data.c - prev)*10)/10;
			if (change > 0) {
				var dir = ((data.c - prev) > 0) ? "up" : "down";
				$("#wordrow_"+data.w+" td.c").html(data.c);
				$("#wordrow_"+data.w+" td.ch").empty().append("<div class=\""+dir+"\">"+change+"</div>");
				$("#wordrow_"+data.w+" td.ch div").animate({backgroundColor:'#fff'}, 'slow');
				updateAngstOrder(data);
			}
		} else {
			var min = ($("#datatable1 tr").length >= 11) ? $("#datatable1 tr:last td.c").html() : 0;
			if (data.c > min) {
				$("#datatable1").append("<tr id=\"wordrow_"+data.w+"\"><td class=\"w\">"+data.w+"</td><td class=\"c\">"+data.c+"</td><td class=\"ch\"></td><td class=\"gl\"></td>");
				$("#wordrow_"+data.w).animate({backgroundColor:'#fff',fontWeight:'normal',color:'rgb(68,64,88)'}, 3000);
				updateAngstOrder(data);
			}
		}

	} else {

		var d = new Date();
		var t = d.getTime();
		var k=getIndex(data.ip);
		if (typeof(k) == "number") {
			stars[k]["hits"][stars[k]["hits"].length] = t;
		} else {
			k = stars.length;
			stars[k] = new Array();
			stars[k]["hits"] = new Array();
			stars[k]["hits"][0] = t;
			stars[k]["ip"] = data.ip;
			stars[k]["plotsquare"] = validplotsquares[Math.floor(Math.random()*validplotsquares.length)];
			stars[k]["x"] = (((stars[k]["plotsquare"]-1) % squaresperrow) * pxpersquare) + Math.floor(Math.random()*pxpersquare);
			stars[k]["y"] = (Math.floor((stars[k]["plotsquare"]-1) / squaresperrow) * pxpersquare) + Math.floor(Math.random()*pxpersquare);
			stars[k]["jqo"] = $("<div class=\"star\"><span><span></span></span></div>")
			stars[k]["jqo"].css("left", stars[k]["x"]+"px").css("top", stars[k]["y"]+"px").appendTo(document.body).attr("id", "star" + k).hover(showtip(), hidetip(k));
		}
		stars[k]["lasturl"] = decodeURIComponent(data.path);
		stars[k]["respcode"] = data.respcode;
		if (data.respcode != 200 && data.respcode != 403 && data.respcode != 302 && data.respcode != 304) {
			stars[k]["jqo"].addClass("starerror");
		} else {
			stars[k]["jqo"].addClass("starnormal");
		}
		stars[k]["jqt"] = $("<div class=\"tooltip\"><strong>"+stars[k]["ip"]+"</strong><br />"+stars[k]["lasturl"]+"</div>");
		stars[k]["jqt"].css("left", (stars[k]["x"]+10)+"px").css("top", (stars[k]["y"]-7)+"px").appendTo(document.body).fadeIn("medium", function() { $(this).fadeOut(5000, function(){ return (function() {stars[id]["jqt"].remove() });}) });
		while(stars[k]["hits"].length > 5) stars[k]["hits"].shift();
	}
}

function update() {
	var d = new Date();
	var t = d.getTime();
	for (i=0; i<stars.length; i++) {
		var dt = (t-stars[i]["hits"][stars[i]["hits"].length-1]);
		
		if (dt < 60000) {
			stars[i]["jqo"].fadeTo("slow", (1-(dt/60000)));
		} else {
			stars[i]["jqo"].fadeOut("slow", remove(i));
		}
	}
	if (Meteor.status==0) {
		var str = "Uninitialised";
	} else if (Meteor.status==1) {
		var str = "Loading stream";
	} else if (Meteor.status==2) {
		var str = "Loading controller frame";
	} else if (Meteor.status==3) {
		var str = "Timeout, waiting for retry";
	} else if (Meteor.status==4) {
		var str = "Controller frame loaded and ready";
	} else if (Meteor.status==6) {
		var str = "End of stream, will not reconnect";
	} else {
		var str = "Receiving data, mode: "+Meteor.mode;
		if (Meteor.mode != "longpoll") str += (Meteor.mode=="smartpoll" || Meteor.mode=="simplepoll") ? ", poll frequency: "+Meteor.pollfreq+"ms" : ", last ping: "+Math.round((t-Meteor.lastpingtime)/1000)+"s";
	}
	window.status = str;
}

function getIndex(ip) {
	for (var i=0; i<stars.length; i++) {
		if (stars[i]["ip"]==ip) return i;
	}
	return false;
}

function remove(index) {
	stars[index]["jqo"].remove();
	stars.splice(index, 1);
	for (var i=0; i<stars.length; i++) {
		stars[i]["jqo"].attr("id", "star"+i);
	}
}

function showtip() {
	return (function() {
		var id = $(this).attr("id").replace("star", "");
		stars[id]["jqt"] = $("<div class=\"tooltip\"><strong>"+stars[id]["ip"]+"</strong><br />"+stars[id]["lasturl"]+"</div>");
		stars[id]["jqt"].css("left", (stars[id]["x"]+10)+"px").css("top", (stars[id]["y"]-7)+"px").appendTo(document.body).fadeIn("medium");
	});
}
function hidetip() {
	return (function() {
		var id = $(this).attr("id").replace("star", "");
		stars[id]["jqt"].fadeOut(2000, function(){ return (function() {stars[id]["jqt"].remove() }); });
	});
}

function updateAngstOrder(data) {
	var row = $("#wordrow_"+data.w);
	while (row.prev().length && data.c > parseFloat(row.prev().children("td.c").html())) {
		var prev = row.prev();
		row.remove().insertBefore(prev);
	}
	while (row.next().length && data.c < parseFloat(row.next().children("td.c").html())) {
		var next = row.next();
		row.remove().insertAfter(next);
	}
	while ($("#datatable1 tr").length > 11) {
		$("#datatable1 tr").eq(($("#datatable1 tr").length-1)).remove();
	}
	if (data.w == "me") updateFlash("me", data.c);
}

function updateFlash(word, value) {
	var now = new Date();
	var hrs = now.getHours();
	var mns = now.getMinutes();
	var scs = now.getSeconds();
	var nowts = Math.floor(now.getTime()/1000);
	angstdata[nowts] = value;
	var xml = "";
	for (var i=0; i<=59; i++) {
		scs--;
		if (scs==-1) { scs = 59; mns--; }
		if (mns==-1) { mns = 59; hrs--; }
		if (hrs==-1) hrs=23;
		var fsec = (scs<10) ? "0"+scs : scs;
		var fmin = (mns<10) ? "0"+mns : mns;
		xml = "<value xid=\""+i+"\">"+hrs+":"+fmin+":"+fsec+"</value>"+xml;
	}
	var xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<chart>\n<series>\n"+xml+"</series><graphs><graph gid=\"1\">";
	for (var ts in angstdata) {
		var secago = nowts - ts;
		if (secago > 60) delete angstdata[ts];
		xml += "<value xid=\""+secago+"\">"+angstdata[ts]+"</value>";
	}
	xml += "</graph></graphs></chart>";
	if ($("#amlineswf").length && typeof($("#amlineswf").get(0).setData)=="function") $("#amlineswf").get(0).setData(xml);
}

function readOrSetCookie() {
	var nameEQ = "MeteorHostId=";
	var ca = document.cookie.split(';');
	for(var i=0;i < ca.length;i++) {
		var c = ca[i];
		while (c.charAt(0)==' ') c = c.substring(1,c.length);
		if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
	}
	var now = new Date();
	var val = now.getTime()+""+Math.floor(Math.random()*1000000);
	document.cookie = "MeteorHostId="+val+"; path=/";
	return val;
}

function doapos(str) {
	return str.replace(/\'/, "%27");
}