var type;
var url;
var username;
var orderby;

$(document).ready(function () {

	$("#orderby").change(function () {
    	loadResults();
	});
});

function e(source){
    source.onerror = "";
    source.src = "http://s.twimg.com/a/1268333781/images/default_profile_3_normal.png";
    return true;
}

function loadResults(){
	$("#result").html('<div id="loading-between-tabs"><img id="loadingImage" height="45" width="45" src="http://cdn.cloudfiles.mosso.com/c84462/loading.gif" /> <h2>Loading...</h2><p>(If you\'re popular this might take awhile)</p></div>');

	timeOutEvent = null;
	url = window.location.href;
	url = url.replace(/\?.*$/, "");
	
	// get type
	if(url.indexOf('fans') > -1)
	{
		type = 'fans';
		url = url.replace('/fans', '');
	}
	else if(url.indexOf('friends') > -1)
	{
		type = 'friends';
		url = url.replace('/friends', '');
	}
	else
	{
		type = 'following';
		url = url.replace('/following', '');
	}
	
	username = url.replace('http://', '').replace('friendorfollow.com/', '').replace('dev.', '').replace('test.', '').replace('/', '');
	
	protectedAccount = $("#protected").val();
	
	if(protectedAccount == "false")
	{
		getFriendsIds(username, -1);
		getFollowersIds(username, -1);
	}
	
	// get ordey by value
	orderby = "screen_name";
	orderby = $("#orderby").val();
	
	// add trailing slash if needed
	if(url.lastIndexOf('/') + 1 != url.length)
		url = url + '/';
	
	url = url + "results/?" + window.location.search.substring(1);
	
	if(protectedAccount == "true")
	{
		$("#result").load(url, {'i[]': null, 'missFire': true, 'orderby':orderby, 'type':type});
	}
	else
	{
		runAjaxStopOnce = 0;
		$(document).ajaxStop(function() {
	
			if(runAjaxStopOnce == 0)
			{
				clearTimeout(timeOutEvent);
				runAjaxStopOnce++;
				
				ids = null;
				
				missFire = false;
				if(calledGetFriendsIds == false || calledGetFollowersIds == false)
					missFire = true;
				else
				{
					if(type == 'fans')
						ids = array_diff(followersIds, friendsIds);
					else if(type == 'friends')
						ids = array_mutual(followersIds, friendsIds);
					else
						ids = array_diff(friendsIds, followersIds);
				}
	
				$("#result").load(url, {'i[]': ids, 'missFire': missFire, 'orderby':orderby, 'type':type});
			}
		});
	}
}

var timeOutEvent = null;
function setTimeOut()
{
	if(timeOutEvent == null)
		timeOutEvent = setTimeout('failWhale()', 5000);
}

function failWhale()
{
	$("#result").load(url, {'i[]': null, 'missFire': true, 'orderby':orderby, 'type':type});
}

var friendsIds = [];
var calledGetFriendsIds = false;
function getFriendsIds(username, cursor)
{
	setTimeOut();
	var url = "http://api.twitter.com/1/friends/ids.json?screen_name=" + username + "&cursor=" + cursor + "&callback=?";
	$.getJSON(url,
		function(data){
			clearTimeout(timeOutEvent);
			calledGetFriendsIds = true;
			cursor = data.next_cursor;
			
			if(cursor > 0)
				getFriendsIds(username, cursor);
			
			moreFriendsIds = jQuery.makeArray(data.ids);
			$.merge(friendsIds, moreFriendsIds);
		});
}

var followersIds = [];
var calledGetFollowersIds = false;
function getFollowersIds(username, cursor)
{
	setTimeOut();
	var url = "http://api.twitter.com/1/followers/ids.json?screen_name=" + username + "&cursor=" + cursor + "&callback=?";
	$.getJSON(url,
        function(data){
        	clearTimeout(timeOutEvent);
			calledGetFollowersIds = true;
			cursor = data.next_cursor;
			
			if(cursor > 0)
				getFollowersIds(username, cursor);
			
			moreFollowersIds = jQuery.makeArray(data.ids);
			$.merge(followersIds, moreFollowersIds);
		});
}


function array_mutual(array1, array2)
{
	var diff = array1.slice(0);
	var match = array2.slice(0);
	var mutual = [];
	
	diff = unique(diff);
	match = unique(match);
	
	var ml = match.length;
	for(var i = 0; i < ml; i++)
	{
		var found = binarySearch(diff, match[i]);
		
		if(found != -1)
		{
			mutual.push(diff[found]);
		}
	}
	return mutual;
}


function array_diff(array1, array2)
{
	//var time = new Date().getTime();
	
	var diff = array1.slice(0);
	var match = array2.slice(0);
	
	diff = unique(diff);
	
	var ml = match.length;
	for(var i = 0; i < ml; i++)
	{
		var found = binarySearch(diff, match[i]);
		
		if(found != -1)
		{
			diff.splice(found, 1);
		}
	}
	
	//alert(new Date().getTime() - time);
	
	return diff;
}

function sortNumber(a,b)
{
return a - b;
}

function unique(a){
	a.sort(sortNumber);
	for(var i = 1;i < a.length;){
		if(a[i-1] == a[i]){a.splice(i, 1);}
		else{i++;}
	}
	return a;
}

function binarySearch(items, value){
	var startIndex = 0,
	    stopIndex = items.length - 1,
	    middle = Math.floor((stopIndex + startIndex)/2);
	    
	while(items[middle] != value && startIndex < stopIndex){
	
	    //adjust search area
	    if (value < items[middle]){
	        stopIndex = middle - 1;
	    } else if (value > items[middle]){
	        startIndex = middle + 1;
	    }
	    
	    //recalculate middle
	    middle = Math.floor((stopIndex + startIndex)/2);
	}
	
	//make sure it's the right value
	return (items[middle] != value) ? -1 : middle;
}