number_of_users = $('#data-table .user').size();
if (!number_of_users) $('html,body').scrollTop($(document).height());

$(document).ready(function() {
	//how big is our graph at the moment?
	upper_limit = $('#play-ground li').size() - 1;
	
	//how many users do we have?
	
	
	//set up the search field and scroll to the bottom
	$("#screen-name").defaultvalue("Twitter Username").alphanumeric();
	
	//set up AJAX
	$.ajaxSetup({
			beforeSend:function(){
				$("form#add-user").addClass("loading");
				$("form#add-user input").attr("disabled", true);
			},
			error:function(XMLHttpRequest, textStatus, errorThrown){
				switch(textStatus) {
					case "error":
						error_message = "Cannot find that user.";
						break;
					case "timeout":
						error_message = "Connection timed out. Sorry, please try again.";
						break;
					default:
						error_message = "Unknown Error: "+$textStatus;
				}
				showError(error_message);
				
			},
			success:function(user, textStatus){
				plot_user(user);
				$("#screen-name").val("");
			},
			complete:function(){
				//alert("select the field");
				$("form#add-user").removeClass("loading");
				$("form#add-user input").removeAttr("disabled");
				$("#screen-name").focus().select().addClass("focussed");
			},
			timeout:5000
			});		
	
	//set up the user form
	$("form#add-user").submit(function(){
		screen_name = $("#screen-name").val();
		add_user(screen_name);      
		return false;
	});
	
	setup_site_info();
	if(location.hash!="") {
		if(location.hash.indexOf("site-info-")>0) $("a."+location.hash.substr(1)).click();
		else add_user(location.hash.substr(1));
	}
	
	if(!$.browser.msie)setup_above_below();
		
});

function add_user(screen_name) {
	screen_name = screen_name.toLowerCase();
	if (screen_name == "twitter username" || screen_name == "") {
		showError("No username entered.");
		$("form#add-user").removeClass("loading");
		$("form#add-user input").removeAttr("disabled");
		$("#screen-name").focus().select();
		return false;
		}
	plotted = $("#user-"+screen_name).size();
	if (!plotted) get_user(screen_name);
	else {
		scroll_to_user("#user-"+screen_name);
		$("#screen-name").val("");
	}	
}

function get_user(screen_name) {
	$("#screen-name").val(screen_name);
	$.getJSON(screen_name+"/json");
}

function plot_user(user) {
	//how many users do we have at the moment
	number_of_users = $('#data-table .user').size();
	
	//set the permalink URL
	location.hash = user.screen_name = user.screen_name.toLowerCase();
	
	//round the twequency
	user.twequency_recent = Math.round(user.twequency_recent*10,1)/10;
	user.twequency_average = Math.round(user.twequency_average*10,1)/10;
	
	//do we need to make the graph any bigger
	twequency_max = Math.ceil(user.twequency_recent)+2;
	if (twequency_max > upper_limit) set_upper_limit(twequency_max);
	if (user.twequency_recent < 0.3) $("#plotter-div").addClass("zero-shower");
	
	//add the user to the graph
	rotation_class = (number_of_users % 4) + 1;
	
	$("#data-table").append("<tr id=\"user-"+user.screen_name+"\" class=\"user rotation"+rotation_class+"\"><td class=\"screen_name\"><img src=\"http://twivatar.org/"+user.screen_name+"/bigger\" /><span>"+user.screen_name+"</span></td><td class=\"twequency_recent\"><span>"+user.twequency_recent+"</span></td><td class=\"twequency_average\">"+user.twequency_average+"</td><td class=\"tweet_this\"><a href=\"/tweet-this/"+user.screen_name+"\">Tweet This</a></td></tr>");
	user_block = "#user-"+user.screen_name;
	
	//indicate relation to average
	indicator = (user.twequency_recent > user.twequency_average) ? "&uarr;" : ((user.twequency_recent < user.twequency_average)?"&darr;":"&#x25CF;");
	$(user_block + " .twequency_recent").append(" <abbr title=\"Average daily tweets: "+user.twequency_average+"\"> "+indicator+"</abbr>");
	
	//position the user on the graph
	twequency_plotted = user.twequency_recent;
	
	from_bottom = twequency_plotted*150;//block height hardcoded here
	$(user_block).css("bottom",from_bottom+"px");
		
	from_side = Math.floor(Math.random()*61);
	if (from_side<=30) {
		$(user_block).css("left",10+from_side+"%");
	} else {
		$(user_block).css("right",from_side-20+"%");
	}
	
	//animate scroll to user
	scroll_to_user(user_block,twequency_plotted);
	
}

var currently_animating = false;
function scroll_to_user(user_block,twequency_plotted) {
	//HIDE site-info
	if ($("#site-info").hasClass("expanded"))hide_site_info();
	
	if (twequency_plotted > 4) {
		easing = "easeOutElastic";
		duration = 1750;
	} else {
		easing = "easeOutQuad";
		duration = 1000;
	}
	currently_animating = true;
	
	scroll_to = (!$.browser.msie)?$(user_block).offset().top:($("#plotter-div").height() - $(user_block).css("bottom").replace(/[^0-9]/g, '') - $(user_block).height());
	scroll_to -= 200;//$(window).height() returns document height in Opera so removing this for now
		
	$('html,body').animate({scrollTop: scroll_to}, 1750,easing,function(){
		currently_animating = false;
		location.hash = user_block.substr(6);
	});
	
	//highlight this user
	$(".user.new").removeClass("new");
	$(user_block).addClass("new");
	setupTimer();
}

var timeoutID = "";
function setupTimer() {
	delay = 2 * 1000;
	clearTimeout(timeoutID);
	timeoutID = setTimeout(function() {$(".user.new").removeClass("new");}, delay);
}


function set_upper_limit(new_upper_limit) {
	//grab variables we need for later
	bands_to_add = new_upper_limit - upper_limit;
	current_top = $('body').scrollTop();
	
	//add the new bands
	while (upper_limit < new_upper_limit) {
		upper_limit++;
		$("#play-ground").prepend("<li class=\"band"+(upper_limit%20)+"\"><abbr title=\""+upper_limit+" tweets per day\">"+upper_limit+"</abbr></li>");
	}
	//put page back to same place it was (band-height is hardcoded here)
	height_added = bands_to_add * 150;
	$('body').scrollTop(current_top+height_added)
}

function showError(message) {
	$("#request-status").text(message)
						.fadeIn(200)
						.animate({opacity: 1.0}, 3000)
    					.fadeOut(400, function() {
      						$(this).text("");
    					});
}

function setup_above_below() {
	var current_above = "";
	var current_below = "";
	var next_above = "";
	var next_below = "";
	
	var title = "";
	var previous = "";
	var users = "#data-table .user:";
	
	
    $(window).bind("scroll resize", function(event) {
    	next_above = "";
		next_below = "";
        if (!$(users+"in-viewport").size() && !currently_animating) {
        	
			var lowest_twequency_above = 86400;
			var highest_twequency_below = -10;
        
        	$(users+"above-the-top").each(function() {
        		screen_name = $(this).find(".screen_name span").text();
        		twequency = parseFloat($(this).find(".twequency_recent span").text());
        		if (twequency < lowest_twequency_above) {
        			next_above = screen_name;
        			lowest_twequency_above = twequency;
        		}
        	});
        	$(users+"below-the-fold").each(function() {
        		screen_name = $(this).find(".screen_name span").text();
         		twequency = parseFloat($(this).find(".twequency_recent span").text());
        		if (twequency > highest_twequency_below) {
        			next_below = screen_name;
        			highest_twequency_below = twequency;
        		}
        	});        	
        }   
        
        
        if (next_above != current_above) {
        	$("#next-above").html(next_above);
        	if(next_above != "")$("#next-above").append(" &uarr;");
        	current_above = next_above;
        } 
        if (next_below != current_below) {
        	$("#next-below").text(next_below);
        	if(next_below != "")$("#next-below").append(" &darr;");
        	current_below = next_below;
        }     
    });
    $("#next-above").bind("click",function(){scroll_to_user("#user-"+next_above);});
    $("#next-below").bind("click",function(){scroll_to_user("#user-"+next_below);});

}

function setup_site_info() {
	//set up site-info links
	$("#site-info-nav a").click(function(){
		if($(this).hasClass("current")) {
			hide_site_info();
		} else {
			hasCurrent = $("#site-info-nav a.current").size();
			item_label = $(this).attr('class');
			if (hasCurrent) {
				$("#site-info-nav a.current").removeClass("current")
				$(".site-info-content").hide();				
				$("#"+item_label.substr(5)).show();
			} else {
				$("#site-info").addClass("expanded");
				$("#"+item_label.substr(5)).slideDown(200);
				$("#shield").fadeIn(200);
			}						
			$(this).addClass("current");
			location.hash = item_label;
		}
		return false;
	});
	
	$("#shield").click(function(){hide_site_info();});
}

function hide_site_info() {
	$("#site-info").removeClass("expanded");
	$("a.current").removeClass("current");
	$(".site-info-content").hide();
	$("#shield").fadeOut(200);
	
	current_top = $('body').scrollTop();
	location.hash = "";	
	$('body').scrollTop(current_top);
}